0

现在我正在处理一个需要的 AS2 代码:

  • 加载另一个 AS2 SWF。
  • 在加载的 SWF 上方显示另一个 MovieClip。
  • 访问加载的 SWF 的 MovieClip 中的变量。

这是我的代码,现在:

    loadMovieNum("player.swf",5);
    delay = function () {
    var first:MovieClip = _root.attachMovie("OnTop","nf",10);
    trace(_root.nf);
    trace(_layer5);
    clearInterval(delayi);
    }

delayi = setInterval(delay, 3000); //3 seconds to let the video load. 

我试图在加载的 swf 上方显示一个绘图(“OnTop”是我给一个符号的名称,它的类型是一个 MovieClip),但发生的情况是视频显示在其他所有内容之上,并且跟踪输出是:

_level0.nf
undefined

我究竟做错了什么?为什么新的 MovieClip 没有显示在加载的上方?此外,在加载 SWF 之后,如何访问其主 MovieClip 中的变量?

4

1 回答 1

0

我个人会用 MovieClipLoader 来做这件事。使用计时器来假设加载持续时间是非常危险的,因为它会产生竞争条件,连接速度非常慢的用户将会失败。

这是一个简单的示例,使用 MovieClipLoader 和 Delegate 将事件函数的范围保持在代码的其余部分本地,就像在 AS3 中的 addEventListener 一样。首先,要加载的 SWF,我称之为“child.swf”。这包含一个动画,在第 1 帧它定义了一个名为 'hello' 的字符串变量:

var hello:String = "Hi";

在父 SWF 中,我们将拥有加载程序代码和一个标识符为“mc1”的库项目,它将附加到加载的 SWF 上方的舞台。

//grab Delegate to mimic AS3 event handler scope
import mx.utils.Delegate;
//create container for the loaded SWF
var loadedMC:MovieClip = createEmptyMovieClip("loadedMC",5);
//create the loader (don't cast it though, or you can't directly access the events)
var loader = new MovieClipLoader();
//set up a listener for the load init (called when the first frame of the loaded MC is executed)
loader.onLoadInit = Delegate.create(this, onMovieInit);
//start loading
loader.loadClip("child.swf",loadedMC);
//init handler
function onMovieInit()
{
    //create the next layer from the library
    var firstMC:MovieClip = attachMovie("mc1","newName",10);
    //trace var from loaded mc
    trace(loadedMC.hello); // hi
}

MovieClipLoaderonLoadInit在目标 SWF 已加载且第一帧已处理后调用该函数,这意味着第一帧上的任何代码现在都可用于父 SWF。委托调用onLoadInit而不是使用监听器对象作为官方文档希望您删除_root在处理程序函数中使用的要求,因为函数的范围没有改变。

于 2011-08-22T10:58:14.927 回答