Почему события MovieClipLoader не запускаются при загрузке в оболочку AS3? - PullRequest
1 голос
/ 09 ноября 2011

Пытаясь ответить на этот вопрос: Вызов функции AS2 из контейнера AS3 Я наткнулся на контрольно-пропускной пункт.Настройка представляет собой AS3 SWF, который загружает AS2 SWF, который, в свою очередь, загружает другой AS2 SWF.Связь между SWF AS3 и родительским SWF AS2 осуществляется с помощью localConnection.

child_as2.swf - это очень простая анимация временной шкалы перемещения блока по экрану со следующим кодом накадр 1:

stop();
function playMovie() {
    play();
}

parent_as2.swf - это промежуточный контейнер AS2, который загружается в child_as2.swf.Загрузка инициируется вызовом LocalConnection:

import mx.utils.Delegate;

this._lockroot = true;

var container:MovieClip = createEmptyMovieClip("container", 10);
//mustn't cast this or the Delegate breaks
var mcLoader = new MovieClipLoader();
mcLoader._lockroot = true;
mcLoader.onLoadInit = Delegate.create(this,onMCLoadInit);

function onMCLoadInit() {
    trace("load init");
    container.playMovie();
}

//LocalConnection code
var myLC:LocalConnection = new LocalConnection();

myLC.loadChild = function(){
    mcLoader.loadClip("child_as2.swf", container);
    trace("loading");
}

myLC.connect("AVM");

parent_as3.swf - это внешняя оболочка, написанная на AS3.Он загружает parent_as2.swf и связывается с ним через LocalConnection:

var myLC:LocalConnection = new LocalConnection();

var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.INIT,onLoaded);
loader.load(new URLRequest("parent_as2.swf"));
addChild(loader);


function onLoaded(event:Event):void {
    //setTimeout hack to circumvent #2000 Security context error
    setTimeout(function() {
        myLC.send("AVM", "loadChild");
    },1);
}

Проблема заключается в том, что функция onMCLoadInit в parent_as2 никогда не вызывается, когда она загружается в оболочку AS3, хотя загрузка действительно занимаетместо.События также терпят неудачу при использовании объекта слушателя вместо Делегата.Коробка из child_as2.swf видна, но никогда не начинает двигаться.Однако, если я запускаю parent_as2.swf сам по себе и запускаю загрузку без LocalConnection, все работает нормально.Он также работает правильно при запуске из внешнего вызова LocalConnection.Почему оболочка AS3 предотвращает запуск событий MovieClipLoader?

Обновление:

Так что, принимая во внимание, что из MovieClipLoader в parent_as2.swf нельзя запускать события, я изменил код для обнаруженияСостояние loadInit путем комбинации опроса MovieClipLoader.getProgress() и наличия функции в child_as2.swf.Это не красиво, но, кажется, работает.Я все же предпочел бы предложить решение с использованием событий.

var container:MovieClip = createEmptyMovieClip("container", 10);
var mcLoader:MovieClipLoader = new MovieClipLoader();
var loadStarted:Boolean;
var checkingInt:Number;

function checkProgress() {
    var progObj:Object = mcLoader.getProgress(container);
    if(progObj.bytesLoaded == progObj.bytesTotal && loadStarted) {
        //load complete, wait for loadInit
        if(typeof(container.playMovie) == "function") {
            //loadInit
            clearInterval(checkingInt);
            container.playMovie();
        }
    }
    //ensures the first loop is ignored due to inaccuracy with reporting
    loadStarted = true;
}

//LocalConnection code
var myLC:LocalConnection = new LocalConnection();

myLC.loadChild = function() {
    loadStarted = false;
    mcLoader.loadClip("child_as2.swf", container);
    checkingInt = setInterval(checkProgress,5);
}

myLC.connect("AVM");

1 Ответ

0 голосов
/ 10 ноября 2011

Я думаю, что его область делегата в as2 при загрузке в родительский объект становится родительским _root.Таким образом, «это» будет относиться к родительскому корню, где функция не существует.Вы пытались поместить this._lockroot = true; в parent_as2?

Вот лучшее объяснение

Также в качестве примечания к вашему хаку безопасности.Надлежащим решением для этого было бы, чтобы дочерний элемент связался с родителем и выполнил «команду типа« Я готов »», которая запускает события связи от родителя к дочернему элементу.setTimeout просто задерживает любые обращения к ребенку, давая ему время для инициализации, что может быть плохо на медленных компьютерах.Я много загружал AS2 в AS3 несколько лет назад.Если вы не можете сказать LOL

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