Сбой Flash (заканчивается циклом перезапуска) при загрузке внешнего SWF - PullRequest
1 голос
/ 30 июня 2010

Я работаю с FlashDevelop и имею два основных проекта, все это чисто AS3 проекты.

При попытке загрузить мой второй проект из основного проекта я получаю всевозможные ошибки.

Класс Main основного проекта расширяет Sprite, а класс Main в проекте «для импорта» расширяет MovieClip. Глядя на загрузку swf в окне отладки в FD, все выглядит нормально:

[SWF] 'pathToSwf'\secondProject.swf - 410 626 bytes after decompression.

Если я пытаюсь назначить загруженный SWF только что созданному MovieClip, я получаю сбой приведения:

swfContent = loader.content; // =>
Type Coercion failed: cannot convert Main@46c0201 to flash.display.MovieClip.

Итак, типизирование загруженного контента выглядит так:

swfContent = loader.content as MovieClip;

удаляет эту ошибку, но затем я попадаю в следующую яму, когда пытаюсь вызвать addChild:

Error #2007: Parameter child must be non-null.

Пытаясь обойти проблему, я пытался добавить загрузчик прямо в контейнер, где я хочу показать внешний SWF. Вот когда начинаются настоящие интересные проблемы:

targetContainer.addChild(loader);

Мое основное приложение теперь зависает, перезапускаясь в бесконечном цикле. Понятия не имею почему ..

Так что моя проблема действительно. Как мой внешний SWF может быть загружен, но затем снова будет нулевым. Он прекрасно работает, когда я запускаю внешний SWF самостоятельно ...

Ответы [ 4 ]

1 голос
/ 30 июня 2010

Используйте getQualifiedClassName и getQualifiedSuperclassName функций (и даже descriptionType , если необходимо) на loader.content для получения точной информации о типе.

loader.content as MovieClip возвращает null, поскольку loader.content не является MovieClip - приведение с ключевым словом as автоматически возвращает null в случае сбоя. Есть ли вероятность того, что загруженный контент представляет собой фрагмент ролика AS2 вместо фрагмента ролика AS3? В этом случае getQualifiedClassName вернет "AVM1Movie".

0 голосов
/ 01 июля 2010

Таким образом, проблема заключалась в том, что основной класс моего загруженного SWF-файла имел то же имя, что и SWF-файл, с которого я загружал.Это привело к тому, что когда flash пытается выполнить загруженный SWF-файл, он фактически вызывает родительский класс MAIN, что приводит к циклическому поведению.

Во избежание этого DHuntrods предложил изменить домен приложения, который решилвопрос.

loader = new Loader();
var AD:ApplicationDomain = new ApplicationDomain( null );
var context:LoaderContext = new LoaderContext( false, AD );
loader.load(new URLRequest(path), context);
0 голосов
/ 30 июня 2010

Ваш swfContent будет нулевым, если его нельзя привести к MovieClip.Вот как должен работать оператор as, когда приведение типов не удается.

Измените операцию назначения следующим образом:

var swfContent :MovieClip = MovieClip(loader.content);

Возможно, вы захотите включить назначение в блок try...catch, так как в случае сбоя вместо * будет выдана ошибка1010 * устанавливается равным нулю, как и as.

0 голосов
/ 30 июня 2010

Последние проблемы странные, но сначала попробуйте изменить тип swfContent на Sprite. Основной класс не всегда расширяет MovieClip, и, судя по сообщению об ошибке, в данном случае это действительно не так.

...