предварительная загрузка внешнего .swf с файлом класса as3 - PullRequest
0 голосов
/ 19 марта 2011

, поэтому я пытаюсь создать внешний предварительный загрузчик для загрузки моего основного файла .swf (loading.swf), который имеет файл класса с именем mainLoading.as, используя этот код:

var l:Loader = new Loader();
l.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, loop);
l.contentLoaderInfo.addEventListener(Event.COMPLETE, done);
l.load(new URLRequest("loading.swf"));
var loadingPage:loading = new loading;

function loop (e:ProgressEvent):void{
    addChild(loadingPage);
    loadingPage.x = stage.stageWidth/2;
    loadingPage.y = stage.stageHeight/2;

}

function done (e:Event):void{
    removeChild(loadingPage);
    addChild(l);
}

, поэтому я 'получаю сообщение об ошибке:

TypeError: Ошибка # 1009: Невозможно получить доступ к свойству или методу пустой ссылки на объект.at mainLoading ()

Я думаю, что получаю сообщение об ошибке, потому что я получаю доступ к стадии в моем файле класса mainLoading ().Я попытался добавить это к конструктору в моем файле класса, но это не сработало:

public function mainLoading () {
    addEventListener(Event.ADDED_TO_STAGE, init);   
}
private function init(e:Event): void {
    initStartUpScene ();

}

моя функция initStartUpScene просто бросает вступительную сцену в loading.swf

какие-либо предложения?

спасибо за вашу помощь.

Ответы [ 4 ]

0 голосов
/ 24 марта 2011

OOOOOOKKKKK, так что примерно после недели признания поражения, повторной попытки, переписывания почти половины моего кода, попытки убедить себя в том, что прелоадеры переоценены, я наконец-то понял (барабанная дробь, пожалуйста):

У меня была переменная, которая ссылалась на вызываемый этап перед вызовом моего метода конструктора.как это:

приватная переменная xScrollPosRight: Number = stage.stageWidth - xScrollPosLeft;

Я только что изменил stage.stageWidth на 750, и это сработало.

живи и учись.

0 голосов
/ 20 марта 2011

Если это именно то сообщение, которое вы получаете, то да, добавление прослушивателя ADDED_TO_STAGE должно исправить это. Не забудьте перекомпилировать "loading.swf", если вы вносите в него какие-либо изменения (шаг, который я всегда забываю)

Работает ли "loading.swf" без ошибок, когда запускается самостоятельно (не загружая его в SWF-контейнер)?

0 голосов
/ 20 марта 2011

Это может быть не связано с заданным вами вопросом, но вы можете получить лучшие результаты и избежать некоторых ошибок, структурируя ваш код следующим образом:

var loadingPage:loading = new loading;
addChild(loadingPage);
loadingPage.x = stage.stageWidth/2;
loadingPage.y = stage.stageHeight/2;

var l:Loader = new Loader();
l.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgress);
l.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
l.load(new URLRequest("loading.swf"));

//I renamed this function since I believe "loop" is a reserved keyword.
function onProgress (e:ProgressEvent):void{
    //No code needed
}

function onComplete (e:Event):void{
    removeChild(loadingPage);
    addChild(l);
}

Вы можете удалить функцию «onProgress», если она вам также не понадобится.

0 голосов
/ 19 марта 2011

(вопрос): ваш mainLoading расширяет либо Sprite, либо Movieclip?

РЕДАКТИРОВАТЬ

После прочтения вашего комментария я бы предложил попробовать это:

Добавьте вызов функции внутри содержимого SWF в вашем полном обработчике прогресса:

function done (e:Event):void{
    removeChild(loadingPage);
    addChild(l);
    Object(l.content).initMethod();
}

content позволит вам получить доступ к методам в вашем загруженном главном классе .swf (например, mainLoading)

Изамените обработку событий в mainLoading на:

public function mainLoading () {
    //no event handling in constructor
}

public function initMethod():void {
    //here you go
    init();
}

public function init():void { ... //No more event here

Кстати, это не самый чистый способ решения вашей проблемы.

...