场景之间的尴尬(我的符号发生了什么?)

时间:2015-04-03 21:49:41

标签: actionscript-3 flash frame timeline scene

假设我们有一个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”的符号?

1 个答案:

答案 0 :(得分:1)

除了Adobe为Event课程提供的内容之外,我找不到任何与此相关的特定文档,但我相信您遇到的事件与事件之间的差异有关Event.ENTER_FRAMEEvent.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]
...
  1. 在场景1中Event.ENTER_FRAME事件从未被调用。可能是因为该事件已经发生在场景1上的代码之前,帧1正在执行。
  2. null引用实际上与尚未在场景2上初始化的char实例相关。一旦播放头退出帧,可能在实例能够被引用时,它读作一个MovieClip。
  3. 这些行为[可能]是为什么这么多人建议使用文档类在必要时向对象添加对象,将监听器附加到Event.ADDED_TO_STAGE以了解它们何时被添加的原因,以便您可以处理在适当的时间点将它们实际添加到舞台中的功能;而不是等待通过时间轴引用对象。我最好的猜测是,如果在场景1上触发了ENTER_FRAME事件,它也可能跟踪null的{​​{1}},就像在场景2中跟踪char一样。它可能是{ {1}}因为舞台上的显示对象尚未初始化,因此对该对象的代码引用也未初始化。

    我希望我有更多的时间来为你调查这个,但这是我能用来描述你正在经历的行为的最佳测试和解释。

    干杯!