Загрузчик AS3 постоянно перезагружает один и тот же swf-файл

У меня есть флеш-анимация, сделанная на основной шкале времени SWF с парой слоев, некоторыми функциями и некоторыми метками ключевых кадров. Например, у меня есть видеоклип со звездой, которая попадает на экран, а затем запускает dispatchEvent для основной временной шкалы, чтобы перейти к метке кадра «следующий».

Вот пример скрипта действий, используемого на основной временной шкале:

Stars.addEventListener("fadeInTitle",_fadeInTitle);

function _fadeInTitle(e:Event):void {
    Title.gotoAndPlay("fadeIn");
    Stars.removeEventListener("fadeInTitle",_fadeInTitle);
}

stop();

Один только этот SWF работает отлично. Проблема возникает, когда я пытаюсь загрузить этот SWF в другой. Происходит то, что загрузчик продолжает перезагружать SWF снова и снова, перекрывая их, а скрипт действий, который находится на основной временной шкале загруженного SWF, игнорируется, временная шкала воспроизводится непрерывно. Вот код, который я использую для загрузки SWF:

import flash.net.URLRequest;
import flash.display.Loader;
import flash.events.Event;
import flash.events.ProgressEvent;

function startLoad(){
    var mLoader:Loader = new Loader();
    var mRequest:URLRequest = new URLRequest("Fly.swf");
    mLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onCompleteHandler);
    mLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgressHandler);
    mLoader.load(mRequest);
}

function onCompleteHandler(loadEvent:Event){
    addChild(loadEvent.target.content);
}

function onProgressHandler(mProgress:ProgressEvent){
    var percent:Number = mProgress.bytesLoaded/mProgress.bytesTotal;
}

startLoad();

Там нет ничего особенного. Просто загрузчик простой.

Я нашел обходной путь, поместив всю анимацию в один основной фрагмент ролика и поместив этот фрагмент ролика на основную временную шкалу (один ключевой кадр, один слой, без сценария действий), а затем загрузив его. Таким образом, он работает нормально, но он больше похож на патч, чем на решение. Я действительно хотел бы знать, почему возникает ошибка, когда вы пытаетесь загрузить внешний SWF, который использует основную временную шкалу с несколькими слоями, ключевыми кадрами и сценарием действий.

Мы будем благодарны за любую помощь / подсказку.
Большое спасибо за чтение.

m


person hell0.c0pter    schedule 18.02.2011    source источник
comment
Вы пробовали поставить точку останова в startLoad (), чтобы убедиться, что она вызывается только один раз?   -  person Kai    schedule 18.02.2011


Ответы (1)


Сначала извлеките экземпляр загрузчика из функции, в этом нет необходимости. Во-вторых, убейте своих слушателей в функции onComplete. В-третьих, если этот код загрузчика находится на шкале времени вашей оболочки загрузчика, убедитесь, что есть не более одного кадра, или, если есть (хотя не уверен, почему это было бы), поместите остановку на кадре, содержащем код загрузчика. Или, что еще лучше, используйте класс Document, чтобы содержать код загрузчика, а не помещать его на шкалу времени. Думаю, вы как-то снова вызывали startLoad (). Кроме того, убедитесь, что у вас установлен флэш-проигрыватель отладки, чтобы вы получали правильные сообщения об ошибках при просмотре этого файла в браузере.

var mLoader:Loader = new Loader();
var mRequest:URLRequest = new URLRequest("Fly.swf");
mLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onCompleteHandler);
mLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgressHandler);
mLoader.load(mRequest);


function onCompleteHandler(loadEvent:Event)
{
    mLoader.contentLoaderInfo.removeEventListener(Event.COMPLETE, onCompleteHandler);
    mLoader.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS, onProgressHandler);
    addChild(loadEvent.target.content);
}

function onProgressHandler(mProgress:ProgressEvent)
{
    var percent:Number = mProgress.bytesLoaded/mProgress.bytesTotal;
}
person Ribs    schedule 18.02.2011
comment
Спасибо за ответ, все верно, я модифицировал загрузчик, но проблема не в этом. Я нашел решение неожиданно. Я хотел провести некоторый тест с загруженным файлом fla, поэтому я просто сохранил его под другим именем, повторно экспортировал swf и вызвал этот новый swf в моем загрузчике. Никаких изменений кода или чего-то еще, и все работало нормально. Я подозреваю, что это какое-то повреждение старого fla-файла или случайная ошибка памяти. - person hell0.c0pter; 19.02.2011
comment
это странно, но не удивительно. В большинстве случаев Flash работает, но когда это не так, иногда это может стать довольно необъяснимым. Спасибо за галочку. Оценил. :) - person Ribs; 19.02.2011