Проблема AS3, создающая экземпляр класса документов загруженного SWF
Я загружаю один SWF-файл в другой с помощью класса Loader, но когда дочерний SWF-файл завершает загрузку и добавляется в список отображения, его класс документа не создается. У меня есть несколько операторов трассировки, которые должны выполняться при создании объекта, но ничего не происходит при загрузке в родительский SWF. Когда я самостоятельно компилирую дочерний SWF-файл, класс документов работает, как и ожидалось.
Так что мне интересно... как мне связать класс документов дочернего SWF с Loader.content
?
Код обновлен решением от Киши ниже.
public class Preloader extends Sprite {
import flash.net.*;
import flash.display.*;
import flash.events.*;
// code in parent SWF's Document Class (Preloader.as)
private var swfLoader:Loader;
public var mainMovie:MovieClip;
public function Preloader(){
swfLoader = new Loader();
swfLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, loaderDone);
swfLoader.load(new URLRequest("mainmovie.swf"));
}
private function loaderDone(e:Event):void {
// Cast Loader.content to MovieClip
mainMovie = MovieClip(swfLoader.content);
mainMovie.addEventListener(Event.ADDED_TO_STAGE, mainMovieAddedListener);
addChildAt(mainMovie, 0);
}
private function mainMovieAddedListener(e:Event):void {
// init() not necessary
}
}
// MainMovie.as runs after casting swfLoader.content to MovieClip
public class MainMovie extends Sprite {
public function MainMovie(){
trace('MainMovie WHATTUP');
}
public function init():void {
trace('init');
}
}
Ура!
3 ответа
Проблема в том, как вы пытаетесь получить доступ к экземпляру SWF.
Во-первых, на экземпляр класса документа ссылается свойство содержимогоLoader. Вы бы ссылались на это так:
var swf:DisplayObject = swfLoader.content;
Но даже тогда вам придется приводить DisplayObject либо к его реальному классу (в данном случаеMainMovie), либо к динамическому классу (например, MovieClip), так как вы пытаетесь использовать пользовательское свойство, которое не является частью самого DisplayObject., Поэтому вы можете вызвать MainMovie.init() примерно так:
var swf:MovieClip = MovieClip(swfLoader.content);
swf.init();
Надеюсь, это поможет.
Вы добавляете mainMovie на сцену, а затем добавляете слушателя, который его инициирует. Событие не запускается, так как оно добавляется после выхода фильма на сцену.
То, что сказал Кристи, вероятно, верно, потому что ваш метод init не запускается, но более странная проблема заключается в том, что конструктор загруженного дочернего swf, MainMovie, должен запускаться, как только этот объект будет создан.
Всякий раз, когда я делал подобные вещи, я никогда не создавал новый объект Sprite из содержимого загруженного SWF. Похоже, что вы делаете там, используя SWF, как BitmapData, для создания основного фильма Sprite.
Попробуйте это: удалите ваше утверждение, которое говорит swfLoader = null
и вместо этого сказать addChild(swfLoader);
, Если вы все еще хотите, чтобы прослушиватель событий проверял, добавлен ли он на сцену, поставьте его перед тем, как addChild(swfLoader);
и, конечно, поместите его в swfLoader, а не в объект mainMovie:
swfLoader.addEventListener(Event.ADDED_TO_STAGE, mainMovieAddedListener);
addChild(swfLoader);
Посмотрите, что вы получите тогда. [также можете ли вы вставить точную ошибку, полученную при попытке доступа к init?]
Debu