在尝试回答这个问题时: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);
}
问题是onMCLoadInit
parent_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");