2

在尝试回答这个问题时:Call to an AS2 function from the AS3 container我遇到了一个障碍。该设置是一个加载 AS2 SWF 的 AS3 SWF,而后者又加载另一个 AS2 SWF。AS3 SWF 和父 AS2 SWF 之间的通信是通过 localConnection 实现的。

child_as2.swf - 这是一个非常简单的时间轴动画,显示一个盒子在屏幕上移动,第一帧有以下代码:

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

parent_as2.swf - 这是在 child_as2.swf 中加载的中间 AS2 容器。负载由 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);
}

问题是onMCLoadInitparent_as2 中的函数在加载到 AS3 包装器中时从未被调用,尽管加载确实发生了。当使用侦听器对象代替委托时,事件也会失败。child_as2.swf 中的框是可见的,但从不开始移动。但是,如果我自己运行 parent_as2.swf 并在没有 LocalConnection 的情况下开始加载它工作正常。当从外部 LocalConnection 调用触发时,它也能正常工作。为什么 AS3 包装器会阻止 MovieClipLoader 的事件触发?

更新:

因此,接受不能从 parent_as2.swf 中的 MovieClipLoader 触发任何事件后,我修改了代码以通过轮询MovieClipLoader.getProgress()和 child_as2.swf 中函数的存在来检测 loadInit 状态。它不漂亮,但它似乎工作。不过,我仍然希望能够使用事件提供解决方案。

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");
4

1 回答 1

0

我认为它是 as2 中的委托范围,当加载到父级时,父级变为 _root。
所以“this”是指该函数不存在的父根。
您是否尝试过放入this._lockroot = true;parent_as2?

这里有更好的解释

也作为您的安全黑客的旁注。
解决这个问题的正确方法是让孩子联系父母并发出“我准备好输入命令”,这将启动从父母到孩子的通信事件。
setTimeout 只是延迟对孩子的任何调用,让它有时间进行初始化,这在较慢的计算机上可能会很糟糕。
几年前我做了很多将 AS2 加载到 AS3 中的工作。如果你不能告诉大声笑

于 2011-11-09T20:37:24.337 回答