flash - 在 Actionscript 2 中立即引用影片剪辑类实例

标签 flash actionscript actionscript-2

这是一个非常令人沮丧的 Actionscript 2 问题,我遇到了与在时间轴上创建的类关联的影片剪辑,需要立即在代码中引用:

-- 我的库中有一个与类“C”关联的影片剪辑“C”。

-- 类“C”扩展了 MovieClip。

-- 我在舞台上有一个电影剪辑,其帧标签为“关闭”和“打开”。此影片剪辑的实例名称为“mc”。

-- 在“on”框架上有一个类“C”的实例,实例名称为“inst”。

-- 类“C”的构造函数包含一个跟踪语句以输出“C 构造函数!”让我知道舞台上的实例何时创建。

现在假设我运行这段代码:

mc.gotoAndPlay("on");
var inst_mc:MovieClip = mc.inst;

if (inst_mc){
    trace("inst_mc found!");
}else{
    trace("inst_mc NOT FOUND!");
}

var inst_c:C = C(mc.inst);

if (inst_c){
    trace("inst_c found!");
}else{
    trace("inst_c NOT FOUND!");
}

似乎在当前帧的所有代码都执行完之后,才会创建 C 类下的任何对象,因为输出将是这样的:

inst_mc found!
inst_c NOT FOUND!
C constructor!

这到底是怎么回事?我已经明确地告诉 Flash 创作环境,影片剪辑 C 与类 C 相关联,而类 C 是 MovieClip 派生的。所以在我的代码中,gotoAndPlay("on") 将创建位于“on”帧上的影片剪辑“inst”。它能够很好地找到实例,但是当我将其视为类型 C 时,它失败了。然后构造函数发生在所有这些之后。我该如何解决?我希望一旦您更改了时间轴上的某些内容,就会立即创建相应的对象——而且它们确实是,除非不是作为它们的显式类类型。我可以引用我的实例,但只能作为 MovieClip。我到底该如何解决这个问题?它应该输出:

C constructor!
inst_mc found!
inst_c found!

感谢您的帮助!

* 更新 * 感谢您的回复!不幸的是,我的项目没有简单的修复方法,它现在很大并且不容易重组(它也太大而无法转换为 AS3)。我考虑过将 MC 保留在第 1 帧并隐藏它们,但我认为这会不必要地增加开销。即使_visible设置为false,那不还是要耗尽资源吗? (这是一个不同但相关的问题——如果你有一个不可见的复杂、固定的 MC 与根本没有它,性能有什么不同吗?)

我目前的策略是这样的:

mc.gotoAndPlay("on");
var inst_mc:MovieClip = mc.inst;
var inst_c:C = C(mc.inst);

if (inst_c){
    // Even though I moved to the "on" frame,
    // the object was already initialized/existed already
    // so i can use its class code now
    inst_c.do_something_now();
}else{
    // The class is not accessible, so set a boolean flag
    // which will get dynamically assigned to the *movie clip*.
    // The constructor in class C will look to see if the flag
    // has already been set.  If so, it calls do_something_now()
    // within C's constructor.
    // In class C, trigger_do_something_now is a defined as a 
    // Boolean with no default value.
    // It is not set in the constructor.
    inst_mc.trigger_do_something_now = true;
}

这种方法让我很困扰。这是困惑和困惑。但是,我认为这是一个合理的解决方法。你们有什么感想?谢谢!

最佳答案

不幸的是,这就是 AS2 中“面向对象”代码的工作方式。这就是您应该如何想象它:当时间轴播放头在 A 帧上时,您调用 gotoAndStop(B),播放头立即前进,并创建任何必要的对象,但任何时间轴脚本您帧 B 上的 have 尚未执行,因为 Flash 仍在完成帧 A 的执行。直到 Flash 的内部循环的下一次迭代才处理帧 B。

自从上课只是众所周知的送奶工眼中的一闪而过的日子以来,事情就是这样。正如您可以猜到的那样,对于类附加剪辑,一切都一样 - 当您将播放头移动到帧 B 时,Flash 在帧 B 上创建所有内容,但它不运行任何驻留在帧 B 上的脚本 - 这包括构造函数刚刚创建的剪辑 - 直到下一帧。

最简单的解决方法是修改时间轴,以便在第 1 帧中创建有问题的 MC,但在执行 gotoAndStop 命令之前保持隐藏(或非事件、后台等)。您可以通过在给定框架的 IDE 中更改它的 alpha(等)来完成此操作,或者通过在执行 gotoAndStop 的同时调用 init 方法来完成此操作。 最佳 解决方法是使用 AS3,如果可以的话。您还可以选择其他方式,但我推荐这两种方式中的一种。

编辑更新: 是的,“您可以采用的其他方法”之一是将参数放入剪辑或其父级中,并让剪辑在初始化时查找它们,但是最终维护您的代码的任何人都不会感谢您.但我确实做到了。 ;)

在回答您的附带问题时,带有 _visible=false 的剪辑如果在舞台范围内会产生非常小的开销。它没有呈现,但有一个非常小的命中,我认为这与 Flash 计算其边界或类似的东西有关。 (我跑了一次测试,你真的需要数千个才能衡量它。)即使这是一个性能影响问题,解决方法是将不可见的剪辑移到舞台的边界之外。然后他们不会招致任何处理器命中,我发现,他们只使用脚本内存(如果你延迟他们的初始化直到他们准备好使用,那么内存很少)。

请记住,无论剪辑是否可见,事件处理程序都会触发,因此在初始化剪辑之前不要让剪辑注册事件。我要做的是使用属于构造函数的所有内容创建一个 init() 方法,并在您原本构建剪辑的地方调用它。

关于flash - 在 Actionscript 2 中立即引用影片剪辑类实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/896335/

相关文章:

鼠标悬停时的 Flash 事件

actionscript-3 - AS3 错误 #1502

flash - 如何从浏览器启动 adobe air 应用程序

flash - Actionscript 3 和 navigateToUrl 方法

css - VAST Flash 视频广告无法在带有 Video.js 的 Chrome 中播放

flash - 位图事件监听器不工作

actionscript-3 - 将 ActionScript 2 SWF 转换为 ActionScript 3 SWF 文件(代码可以被剥离)

actionscript-2 - 如何在actionscript 2.0中添加按钮来减少和增加间隔速度

actionscript-3 - SEO , Flash 和来自外部文件的数据

javascript - 如何使用 Smokescreen/JavaScript 将 Flash 转换为图像