假设我们有一个flash文件,文件中的所有代码和对象如下所述:
第一场:
只有一个实例名称为“char”的符号在舞台上
场景一的代码:
import flash.events.Event;
stage.addEventListener(Event.ENTER_FRAME,update);
function update(e:Event){
trace(char);
}
play();
场景二:
只有一个实例名称为“char”的符号在舞台上
场景二的代码:
stop();
如果您自己尝试一下,您会发现Flash会将对象char跟踪为“null”一段时间,然后在第二个场景中发现符号后跟踪它。有没有人知道为什么会这样,因为在两个连续场景中都有一个实例名称为“char”的符号?
答案 0 :(得分:1)
除了Adobe为Event课程提供的内容之外,我找不到任何与此相关的特定文档,但我相信您遇到的事件与事件之间的差异有关Event.ENTER_FRAME
和Event.EXIT_FRAME
以及Flash运行时如何初始化对象以供使用。
我使用您的代码Event.ENTER_FRAME
进行了测试,并遇到了您遇到的相同结果;但是,当我使用Event.EXIT_FRAME
事件时,显示对象根本不会跟踪为空。
然后我更进了一步,把我的时间表完全和你的一样;但是,将场景1中的事件代码更改为第1帧:
import flash.events.Event;
import flash.display.MovieClip;
stage.addEventListener(Event.ENTER_FRAME,update);
stage.addEventListener(Event.EXIT_FRAME,update);
function update(e:Event){
if( e.type == Event.ENTER_FRAME ) {
trace("ENTER FRAME: " + currentScene.name);
}
else if( e.type == Event.EXIT_FRAME ) {
trace("EXIT FRAME: " + currentScene.name);
}
trace(char);
}
play();
执行时注意到一些有趣的事情:
EXIT FRAME: Scene 1
[object MovieClip]
ENTER FRAME: Scene 2
null
EXIT FRAME: Scene 2
[object MovieClip]
ENTER FRAME: Scene 2
[object MovieClip]
EXIT FRAME: Scene 2
[object MovieClip]
...
Event.ENTER_FRAME
事件从未被调用。可能是因为该事件已经发生在场景1上的代码之前,帧1正在执行。 null
引用实际上与尚未在场景2上初始化的char
实例相关。一旦播放头退出帧,可能在实例能够被引用时,它读作一个MovieClip。这些行为[可能]是为什么这么多人建议使用文档类在必要时向对象添加对象,将监听器附加到Event.ADDED_TO_STAGE
以了解它们何时被添加的原因,以便您可以处理在适当的时间点将它们实际添加到舞台中的功能;而不是等待通过时间轴引用对象。我最好的猜测是,如果在场景1上触发了ENTER_FRAME事件,它也可能跟踪null
的{{1}},就像在场景2中跟踪char
一样。它可能是{ {1}}因为舞台上的显示对象尚未初始化,因此对该对象的代码引用也未初始化。
我希望我有更多的时间来为你调查这个,但这是我能用来描述你正在经历的行为的最佳测试和解释。
干杯!