Можно ли загрузить класс, не являющийся документом, до запуска прелоадера?

public class Framework extends MovieClip
{
    var _loadingSystem:LoadingSystem;

    public function Framework() 
    {
        _loadingSystem = new LoadingSystem(this);
        loaderInfo.addEventListener(ProgressEvent.PROGRESS,progressHandler);
        loaderInfo.addEventListener(Event.COMPLETE, completeListener);
    }

...

public class LoadingSystem extends MovieClip
{

    public function LoadingSystem(parent:DisplayObjectContainer) 
    {
        parent.addChild(this);

        myLogo.buttonMode = true;
        myLogo.addEventListener(MouseEvent.CLICK, gotoMySite); 
    }

Как видите, Framework - это мой класс Doc, который создает _loadingSystem, который по сути представляет собой фрагмент ролика, содержащий графику предварительного загрузчика. При отладке я получаю следующую ошибку «TypeError: Ошибка № 1009: невозможно получить доступ к свойству или методу ссылки на нулевой объект». указывая на myLogo.buttonMode = true;

Насколько я понимаю, это связано с тем, что LoadingSystem не загружается полностью перед созданием в Framework. Есть ли у меня способ заставить эту работу работать? Я попытался добавить слушателей для Event.ADDED, но это не сработало.

Дополнительная информация: 3-кадровый FLA-файл, первый пустой с остановкой, второй содержит фрагмент ролика AssetHolder, третий - приложение. У меня есть экспорт во втором кадре, установленном в настройках публикации, все флажки для экспорта во втором кадре не отмечены в активах, и все это работало до того, как я изменил экспорт во втором кадре, за исключением того, что он не загружал предварительно 50% файла.


person JesusPiece    schedule 28.02.2011    source источник


Ответы (2)


я думаю, что происходит вот что:

Класс документа ВСЕГДА загружается в первый фрейм, потому что он представляет ваш корневой класс SWF и, следовательно, должен быть там в первом фрейме. Теперь, поскольку вы экспортируете все другие классы во фрейм 2, я могу представить, что LoadingSystem существует только начиная с фрейма два, но вы пытаетесь создать его экземпляр в конструкторе своего класса документа Framework.

Что вы можете попробовать, так это создать метод "инициализации" в Framework и вызвать его из временной шкалы во фрейме 2. И в этом методе вы будете делать то же самое, что вы сейчас делаете в конструкторе Framework.

person ghost23    schedule 28.02.2011

если myLogo - это спрайт / видеоролик на сцене, он не будет существовать, пока LoadingSystem не будет добавлен в stage.

Теперь ваша первая реакция должна быть: «Но я добавил это на сцену с помощью parent.addChild(this)!». Вы не учли, что класс документа не находится на стадии вызова конструктора. Flash в основном выполняется так:

docClass = new DocumentClass();
stage.addChild(docClass);

Это означает, что свойство stage класса документа будет иметь значение null до после завершения конструктора. Это также означает, что любые дочерние элементы, добавленные во время конструктора, не будут иметь доступа к сцене или объектам, расположенным на сцене, до тех пор, пока после не будет добавлен docClass в сцену.

Есть простое исправление; прислушайтесь к событию ADDED_TO_STAGE.

public function LoadingSystem(parent:DisplayObjectContainer) 
{
  parent.addChild(this);
  addEventListener(Event.ADDED_TO_STAGE, initialize);
}

private function initialize(e:Event):void
{
  removeEventListener(Event.ADDED_TO_STAGE, initialize);
  addEventListener(Event.REMOVED_FROM_STAGE, uninitialize);
  //attach stage listeners etc
  myLogo.buttonMode = true;
  myLogo.addEventListener(MouseEvent.CLICK, gotoMySite);
}

private function uninitialize(e:Event):void
{
  removeEventListener(Event.REMOVED_FROM_STAGE, uninitialize);
  addEventListener(Event.ADDED_TO_STAGE, initialize);
  //detach stage listeners etc.
}
person zzzzBov    schedule 28.02.2011