Проблема AS3, создающая экземпляр класса документов загруженного SWF - PullRequest
1 голос
/ 03 мая 2010

Я загружаю один 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 ]

3 голосов
/ 03 мая 2010

Проблема в , как вы пытаетесь получить доступ к экземпляру SWF.

Во-первых, экземпляр класса документа ссылается на свойство Loader content . Вы бы назвали это так:

var swf:DisplayObject = swfLoader.content;

Но даже тогда вам придется привести DisplayObject либо к его реальному классу (в данном случае MainMovie ), либо к динамическому классу (например, MovieClip). ), поскольку вы пытаетесь использовать пользовательское свойство, оно не является частью DisplayObject . Таким образом, вы можете вызвать MainMovie.init () примерно так:

var swf:MovieClip = MovieClip(swfLoader.content);
swf.init();

Надеюсь, это поможет.

1 голос
/ 03 мая 2010

Вы добавляете mainMovie на сцену, а затем добавляете слушателя, который его инициирует. Событие не запускается, так как оно добавляется после выхода фильма на сцену.

0 голосов
/ 03 мая 2010

То, что Кристи сказал, вероятно, правильно, потому что ваш метод инициализации не запускается, но более странная проблема заключается в том, что конструктор загруженного дочернего swf, MainMovie , должен запускаться, как только этот объект создано.

Всякий раз, когда я делал подобные вещи, я никогда не создавал новый объект Sprite из содержимого загруженного SWF. Похоже, что вы делаете там, используя SWF как BitmapData, чтобы создать Sprite mainMovie .

Попробуйте это: удалите ваше утверждение, которое говорит swfLoader = null, и вместо этого произнесите addChild(swfLoader);. Если вы все еще хотите, чтобы прослушиватель событий проверял, добавлен ли он на сцену, поместите его перед выполнением addChild(swfLoader); и, конечно, поместите его в swfLoader , а не в объект mainMovie . :

swfLoader.addEventListener(Event.ADDED_TO_STAGE, mainMovieAddedListener);
addChild(swfLoader);

Посмотрите, что вы получите тогда. [также вы можете вставить точную ошибку, полученную при попытке доступа к init?]

Debu

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...