【发布时间】:2010-10-28 03:15:16
【问题描述】:
这是一个非常令人沮丧的 Actionscript 2 问题,我遇到的影片剪辑与在时间轴上创建的类相关联,需要立即在代码中引用:
-- 我的库中有一个与类“C”关联的影片剪辑“C”。
-- “C”类扩展了 MovieClip。
-- 我在舞台上有一个带有帧标签“关闭”和“打开”的影片剪辑。此影片剪辑的实例名称为“mc”。
-- 在“on”框架上有一个名为“inst”的类“C”的实例。
-- 类“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;
}
这种方法让我很困扰。这是混乱和混乱的。但是,我认为这是一个合理的解决方法。你们有什么感想?谢谢!
【问题讨论】:
标签: flash actionscript actionscript-2