场景之间的尴尬(我的符号怎么了?)

Awkwardness Between Scenes (What happened to my symbol?)

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

除了 Adob​​e 为 Event class 提供的文档外,我找不到与此相关的任何特定文档,但我相信您遇到的问题与事件 Event.ENTER_FRAMEEvent.EXIT_FRAME 以及 Flash 运行时如何初始化对象以供使用。

我 运行 使用您的代码和 Event.ENTER_FRAME 进行了测试,结果与您遇到的相同;然而,当我使用 Event.EXIT_FRAME 事件时,显示对象根本没有跟踪为 null。

然后我更进一步,把我的时间线设置得和你的完全一样;但是,将场景 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. Event.ENTER_FRAME 事件 从未 在场景 1 上调用。可能是因为该事件在场景 1 的代码第 1 帧执行之前已经发生。
  2. null 引用实际上与尚未在场景 2 上初始化的 char 实例相关。一旦播放头离开帧,可能当实例能够被引用时,它读取为 MovieClip。

这些行为 [可能] 是为什么这么多人推荐使用文档 class 在必要时将对象添加到舞台,将侦听器附加到 Event.ADDED_TO_STAGE 以了解它们何时添加的原因,以便您可以在实际添加到舞台的适当时间点处理功能;而不是等待对象能够通过时间线被引用。我最好的猜测是,如果 ENTER_FRAME 事件在场景 1 上触发,它也可能会跟踪 nullchar,就像它在场景 2 上跟踪 null 一样。它可能是 null,因为舞台上的显示对象尚未初始化,因此对该对象的代码引用也尚未初始化。

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

干杯!