Можно ли загрузить класс без документов перед запуском предварительного загрузчика? - PullRequest
0 голосов
/ 28 февраля 2011
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, которая в основном представляет собой мувиклип, содержащий графику предварительного загрузчика. При отладке я получаю следующую ошибку «Ошибка типа: ошибка # 1009: не удается получить доступ к свойству или методу пустой ссылки на объект». указывая на myLogo.buttonMode = true;

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

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

Ответы [ 2 ]

0 голосов
/ 28 февраля 2011

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

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

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

Это означает, что свойство stage класса документа будет нулевым, пока после конструктор не будет завершен. Это также означает, что любые дочерние элементы, добавленные во время конструктора, не будут иметь доступа к сцене или объектам, расположенным на сцене, до тех пор, пока после 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.
}
0 голосов
/ 28 февраля 2011

Я думаю, что происходит так:

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

Что вы можете попробовать, так это создать метод «initialize» в Framework и вызвать его с временной шкалы в кадре 2. И в этом методе вы будете делать то, что вы в настоящее время делаете в конструкторе Framework.

...