Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 20.09.2011, 22:13
Stary вне форума Посмотреть профиль Отправить личное сообщение для Stary Посетить домашнюю страницу Stary Найти все сообщения от Stary
  № 1  
Ответить с цитированием
Stary
 
Аватар для Stary

Регистрация: Jul 2001
Адрес: Харьков
Сообщений: 102
Отправить сообщение для Stary с помощью ICQ
По умолчанию В повторно загружаемом SWF инициализируются старые Flashvars

Объясняю ситуацию:
  1. Имеется приложение AS3, которое загружает в себя swf-файл загрузчик на AS2, который извлекает параметры из запроса и использует их для загрузки в себя некой AS2-игры. Игра написана давно, и ее требуется поддерживать. Реализован интерфейс коммуникации с основным приложением через ExternalInterface.
  2. Задача стоит этот лоадер загружать и выгружать, а потом - загружать снова - чтобы подтянуть другую игру.
  3. Чтобы он мог подтягивать разные игры, ему передаются параметры - гетовской строкой, чтобы потом он читал свои флешвары.
  4. Он читает флешвары исправно в первый раз таким образом: _root["myVar1"], _root["myVar2"]... После чего загружает нужную игру и все в порядке.
  5. Потом пользователь захочет закрыть одну игру и открыть вторую. При этом я как могу чищу и уничтожаю экземпляр класса, который служил для загрузки и отображения первой игры, создаю новый экземпляр и по той же схеме гружу в него ТОТ ЖЕ файл-лоадер, но с другими параметрами, ожидая что он их подхватит и будет использовать.
  6. В логе Charles я вижу, что запрос прошел правильный - с нужной GET-строкой
  7. Но когда я заглядываю в AS2 лоадер, вижу, что нужных параметров он не получил (очевидно, он вместо заргузки взял где-то закешированный уже проинициализированный объект).
Дальше два варианта:
  • Если при уничтожении предыдущего экземпляра-контейнера, я сделал unload ИЛИ unloadAndStop старому Loader-у, то новый AS2 файл НЕ ВИДИТ Flashvars вообще
  • Если этого не делать, то он видит старые Flashvars
Никакими способами это преодолеть не удалось. Пробовал:
  • Хак по принудительному вызову Garbage Collector
  • Передачу параметров через URLrequest.data (не находит)
  • Удалял из загрузчика все лишнее, все листенеры и блокировал дальнейшую загрузку игры
Пока все тщетно. Не хочется пользоваться LocalConnection и ExternalInterface. Есть ли способ этого избежать?

Спасибо.


Последний раз редактировалось Stary; 20.09.2011 в 22:16.
Старый 21.09.2011, 14:51
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 2  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
после упражнений с бубном выяснилось, что у второй и следующих подгруженных AVM1 флешек напрочь отсутствует ссылка на _root: вот ведь действительно бред
но _url вполне себе определяется, т.е. если брать его и самому парсить, то можно эти гет данные взять
тестовый расклад
AS3
Код AS3:
public class Main extends Sprite 
{
	private var loader:Loader = new Loader();
 
	public function Main():void 
	{
		addChild(loader);
		stage.addEventListener(MouseEvent.CLICK, stage_click);
	}
 
	private function stage_click(e:MouseEvent):void 
	{
		var par:String = "z" + int(100 * Math.random());
		var request:URLRequest = new URLRequest("as2Loader.swf?par=" + par);
		loader.load(request);
	}
}
AS2
Код AS1/AS2:
class MainAS2Loader extends MovieClip
{
	private var tf:TextField;
 
	public static function main(swfRoot:MovieClip):Void 
	{
		swfRoot.__proto__ = MainAS2Loader.prototype;
		Function(MainAS2Loader).apply(swfRoot);
	}
 
	public function MainAS2Loader() 
	{
		tf = createTextField("tf", 0, 10, 10, 300, 200);
		tf.border = true;
		tf.text = "par: "+_root["par"];// undefined 
		tf.text += "\nurl: " + _root._url;// undefined
		tf.text += "\n_root: " + _root;//  undefined !! 
		tf.text += "\nthis._url: " + this._url;// работает
	}
}

Старый 21.09.2011, 19:26
Stary вне форума Посмотреть профиль Отправить личное сообщение для Stary Посетить домашнюю страницу Stary Найти все сообщения от Stary
  № 3  
Ответить с цитированием
Stary
 
Аватар для Stary

Регистрация: Jul 2001
Адрес: Харьков
Сообщений: 102
Отправить сообщение для Stary с помощью ICQ
Ух ты. Звучит многообещающе. Попробую обязательно. Спасибо!

Старый 21.09.2011, 22:45
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 4  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
ruFlash не помог ) Я вам больше скажу... Связка AS2+AS3 непобедима в своих глюках. Я смог менять свойства визуальных объектов AVM2 из кода AS2, обращаясь к аналогам, имеющимся в языке AS2.

Например, можно изменить прозрачность DisplayObject используя сл. конструкцию:

_root._parent._parent._alpha = value;

Однако
_root._parent._parent.alpha = value не работал.

Аналогично работают _x и _y. Удачи.
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

Старый 22.09.2011, 00:29
Stary вне форума Посмотреть профиль Отправить личное сообщение для Stary Посетить домашнюю страницу Stary Найти все сообщения от Stary
  № 5  
Ответить с цитированием
Stary
 
Аватар для Stary

Регистрация: Jul 2001
Адрес: Харьков
Сообщений: 102
Отправить сообщение для Stary с помощью ICQ
Ага. А у меня код из AVM1 меняет родительский Stage.scaleMode

Цитата:
Сообщение от dimarik Посмотреть сообщение
ruFlash не помог ) Я вам больше скажу... Связка AS2+AS3 непобедима в своих глюках. Я смог менять свойства визуальных объектов AVM2 из кода AS2, обращаясь к аналогам, имеющимся в языке AS2.

Например, можно изменить прозрачность DisplayObject используя сл. конструкцию:

_root._parent._parent._alpha = value;

Однако
_root._parent._parent.alpha = value не работал.

Аналогично работают _x и _y. Удачи.
Добавлено через 2 минуты
2 silin

Дяденька, объясни что сие шаманство означает. Не дай прозябать в невежестве!

Код AS1/AS2:
 
	public static function main(swfRoot:MovieClip):Void 
	{
		swfRoot.__proto__ = MainAS2Loader.prototype;
		Function(MainAS2Loader).apply(swfRoot);
	}
Теперь все мои флашвары доступны через this["myVar"]! Рыдаю.

Добавлено через 5 минут
2 silin

Да, и кстати. А нельзя ли теперь так же стену в гастрономе научить его понимать _level0, _level1 и т. д. Очень нужно! Интернет безмолвствует!

Старый 22.09.2011, 00:54
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 6  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
да не шаманство никакое, как бы имитация документ класса для AS2
static main - mtasc'вская точка входа с рутом в параметре
swfRoot.__proto__ наследование этого рута от своего класса
Function(MainAS2Loader).apply(swfRoot); - вызов конструктора
т.е. this в этом контексте и есть _root, он же _level0
а вот с остальными _levelN пробовать надо, можно ли вообще туда что-то положить в этой ситуации неизвестно

Старый 22.09.2011, 10:43
Stary вне форума Посмотреть профиль Отправить личное сообщение для Stary Посетить домашнюю страницу Stary Найти все сообщения от Stary
  № 7  
Ответить с цитированием
Stary
 
Аватар для Stary

Регистрация: Jul 2001
Адрес: Харьков
Сообщений: 102
Отправить сообщение для Stary с помощью ICQ
Все равно колдунское колдунство.

Не посоветуете что-нибудь доходчивое почитать про функцию main? Можно на аглицком.
Что делать, если я не использую MTASC или если собираю проект без помощи main (actually I do, но чисто теоретически)?

Сейчас буду проверять что происходит с рутами следующих загружаемых as2-файлов. Означает ли это все, что их тоже придется переписывать?

Добавлено через 4 часа 9 минут
Вот зараза! Все flashvars подхватил. Все в порядке. В первый раз игра грузится и все ок. Во второй раз - с уже новыми параметрами пытаюсь грузить игру, и нифига. Даже запрос не проходит через Charles. Единственная разница, которую я смог заметить: мувиклип-контейнер для дальнейшей загрузки раньше создавался в _root, а теперь - за неимением рута - в this.
Код AS1/AS2:
var mgLoader: MovieClipLoader = new MovieClipLoader();
mTargetMc = this.createEmptyMovieClip("targetMc", 1);
trace("mTargetMc=" + mTargetMc);
mgLoader.loadClip(mMiniGameUrl, mTargetMc);
Трассировка этого мувика в первом случае дает:

mTargetMc=_root.targetMc

При повторной загрузке:

mTargetMc=_level0.instance6.instance132.ApplicationLayer.hBox1.rightVBox.mgpanel.instance153.instance29405.instance29467.instance29468.targetMc

Короче, прикрепило его куда-то в недра Loader-а, который я выкладываю на сцену.
Пробовал прикреплять к имени файла-лоадера префикс с итератором. Чтобы оно, как бы, грузило разные файлы, в то время как файлы одинаковые (для начала просто накопировал нужное количества файлов с соотв. префиксами). Но это не работает! Выходит, что не уничтожается не файл SWF, а сам класс из AVM1! Что бы еще сделать? Вытащить из Loader-а контент и положить на сцену его? Что-то мне подсказывает, что это не поможет.


Последний раз редактировалось Stary; 22.09.2011 в 14:57.
Старый 22.09.2011, 15:32
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 8  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
я похоже потерял нить,в чем затык теперь
какая разница куда лоадер засунул твой клип, важно что он обновляется с новыми флешварсами, только взять их можно не через _root или _level0, а через this на основном таймлайне, не ?
можно наверно и _global._root ему переопределить, если на _root что-то завязано..

mtasc'ский main и выверты с рутовым классом здесь не при делах совсем, просто рабочий темплет, ну и запостил как есть, во избежание

Старый 22.09.2011, 15:38
Stary вне форума Посмотреть профиль Отправить личное сообщение для Stary Посетить домашнюю страницу Stary Найти все сообщения от Stary
  № 9  
Ответить с цитированием
Stary
 
Аватар для Stary

Регистрация: Jul 2001
Адрес: Харьков
Сообщений: 102
Отправить сообщение для Stary с помощью ICQ
Цитата:
какая разница куда лоадер засунул твой клип,
Понятния не имею. Говорю же - это единственное различие, которое я нашел.
Цитата:
можно наверно и _global._root ему переопределить, если на _root что-то завязано..
А можно поподробнее? Завязано много на _level0. Нельзя ли переопределить _global._level0? У меня не получилось, но, кажется, я не все знаю.

Добавлено через 27 минут
Ну, точнее говоря, получилось вот так в конструкторе написать:
Код AS1/AS2:
_global["_root"] = this;
_global["_level0"] = this;
В трейсе вывелось в первый раз:
14:4:482: # _level0 = _root
14:4:483: # _root = _root

Во второй раз:
14:4:64: # _level0 = _level0.instance6.instance121.ApplicationLayer.hBox1.rightVBox.mgpanel.instance153.instance22489.instance22558.instance22559
14:4:64: # _root = _root

Добавлено через 31 минуту
Забыл добавить, что это все равно не помогло.

Добавлено через 43 минуты
Цитата:
Во второй раз:
14:4:64: # _level0 = _level0.instance6.instance121.ApplicationLayer.hBox1.rightVBox.mgpanel.instance153.instance22489.instance22558.instance22559
14:4:64: # _root = _root
Пардон. Это если не делать unloadAndStop


Последний раз редактировалось Stary; 22.09.2011 в 16:06.
Старый 22.09.2011, 16:54
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 10  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
такой нюанс еще: возможно все дело в MTASC' е
стал проверять флешки, скомпиленные в flash IDE, а там нет трабла с потерей рута и соответственно флешварсов
смотрел так
as2Loader
Код AS1/AS2:
trace("as2Loader>> par: "  +_root["par"]);// z80, ну и всякие
var mgLoader:MovieClipLoader = new MovieClipLoader();
var mTargetMc:MovieClip = this.createEmptyMovieClip("targetMc", 1);
trace("as2Loader>> mTargetMc : " + mTargetMc);// _root.targetMc
mgLoader.loadClip("as2Loadee.swf", mTargetMc);
as2Lodee
Код AS1/AS2:
trace("as2Lodee>>_level0 : "+_level0);//_level0
trace("as2Lodee>>_level0.par : "+_level0["par"]);// undefined
trace("as2Lodee>>_root.par : "+_root["par"]); // z80
подгруженная флешка правда _level0.par не видит, но с этими уровнями, когда флешка не в плеере, а в AVM2-лоадере вообще мутно все

Создать новую тему Ответ Часовой пояс GMT +4, время: 06:59.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 06:59.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.