PDA

Просмотр полной версии : Нет события Event.COMPLETE при использовании loadBytes


dimensb
19.06.2012, 19:31
Добрый день

Есть общий класс-контейнер для загрузки SWF, то есть он может содержать любой SWF файл, который содержится во внутреннем объекте MovieClip.
Для клонирования пытаюсь использовать подход, описанный по ссылке http://chargedweb.com/labs/2010/02/20/duplicatemovieclip-is-back-to-as3/ (с созданием нового Loader'а и загрузкой в него данных через метод loadBytes).

Для тестирования используются все обработчики событий, чтобы отследить процесс.

При вызове loadBytes видим следующее

[ProgressEvent type="progress" bubbles=false cancelable=false eventPhase=2 bytesLoaded=0 bytesTotal=8099]
[ProgressEvent type="progress" bubbles=false cancelable=false eventPhase=2 bytesLoaded=8099 bytesTotal=8099],
но на этом все заканчивается, событие complete не вызывается и content нового Loader'а остается равным null.

Судя по всему проблема упоминалась несколько раз (http://forums.adobe.com/message/2691513#2691513), но однозначно работающего решения до сих пор нет.

Возможно кто-то сталкивался с похожей проблемой и знает как ее решить или знает возможные альтернативы.
Как вариант пробовал использовать метод mx.utils.ObjectUtil.copy, который имеет следующий код

public static function copy(value:Object):Object
{
var buffer:ByteArray = new ByteArray();
buffer.writeObject(value);
buffer.position = 0;
var result:Object = buffer.readObject();
return result;
}
,но результат так же равен null.

Как вариант остается создание нового объекта и загрузка в него такого-же SWF, но это лишняя работа и по коду и по загрузке, поскольку данные уже находятся в Flash Player и технически остается их только скопировать.

Заранее спасибо.

Psycho Tiger
19.06.2012, 21:35
А что конкретно находится внутри?
Есть свойство, объявленное в прототипе - constructor - содержащее ссылку на класс, может, подойдёт создание через него?

dimensb
19.06.2012, 21:55
Фактически это просто объект MovieClip, в который переноситься контент из Loader, загружающего SWF с определенного адреса. То есть последовательность действий следующая:

1. Код получает адрес SWF для загрузки
2. Использует Loader чтобы его загрузить
3. Копирует содержимое во внутреннюю переменную типа MovieClip

Основная задача была в том, чтобы сделать максимально общий код, то есть путь к SWF может быть описан в конфигурационном файле и может меняться, поэтому SWF файлы не привязаны к классу (SWC не используются).

По этой причине свойство constructor не подойдет, оно создаст пустой объект MovieClip, но не портирует его содержимое.

Psycho Tiger
19.06.2012, 22:19
Если эти файлы Ваши - то отлично подойдёт ApplicationDomain#getDefinition.
К слову, я не понял, почему constructor создаст пустой мувиклип. Он создаст его с содержимым, которое было в нём (за исключением рисования в graphics и прочих изменений "после").

gloomyBrain
19.06.2012, 22:55
Он создаст его с содержимым, которое было в нём (за исключением рисования в graphics и прочих изменений "после")

Эмм? А конструктору не пофигу - в каком месте байткода инструкции по отрисовке брать? Это я к тому, что если констрктор вызывается и при этом в классе есть и рисование кодом и заготовленный дизайнерами контент - с чего бы всему этому не отрисоваться?

etc
19.06.2012, 23:02
Если эти файлы Ваши - то отлично подойдёт ApplicationDomain#getDefinition.
К слову, я не понял, почему constructor создаст пустой мувиклип. Он создаст его с содержимым, которое было в нём (за исключением рисования в graphics и прочих изменений "после").

Не создаст, если конструктор просто ссылается на MovieClip.

dimensb
19.06.2012, 23:50
Если эти файлы Ваши - то отлично подойдёт ApplicationDomain#getDefinition.
К слову, я не понял, почему constructor создаст пустой мувиклип. Он создаст его с содержимым, которое было в нём (за исключением рисования в graphics и прочих изменений "после").

Если я верно понимаю значение этого свойства, то оно является ссылкой на сам конструктор класса, в данном случае - MovieClip, поскольку SWF файл класса не определяет.

То есть в данном случае у меня есть код наподобие


class X {
private var loader:Loader;
private var content:MovieClip;
private var urlRequest:URLRequest;

public function LoadContent() {
// Here we have to load content using Loader and corresponding Event.COMPLETE event handler

urlRequest = new URLRequest("uri");
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoaderComplete);
loader.load(urlRequest);
}

private function onLoaderComplete(event:Event):void {
// Таким образом content это просто MovieClip

content = MovieClip(loader.content);
}
}


Если я правильно понял описание ApplicationDomain#getDefinition, то при экспорте надо привязать каждый из MovieClip к какому-либо классу?
Почитаю и попробую, спасибо.
Хотя в случае Loader'а не потребовалось бы даже этого, если бы только он работал как написано в документации :(

Psycho Tiger
20.06.2012, 00:21
Не создаст, если конструктор просто ссылается на MovieClip.
А как такое может быть? Это если мувик с контентом, но не привязанный к классу? Хм.
Если я правильно понял описание ApplicationDomain#getDefinition, то при экспорте надо привязать каждый из MovieClip к какому-либо классу?
Почитаю и попробую, спасибо.
Да, именно. На мой взгляд, самый адекватный способ.

etc
20.06.2012, 19:49
А как такое может быть? Это если мувик с контентом, но не привязанный к классу? Хм.
А почему нет-то? На уровне swf у него контент привязан, только взять его с собой нельзя, т. к. нет линкейджа.