场景之间的尴尬(我的符号怎么了?)
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" 的符号?
除了 Adobe 为 Event class 提供的文档外,我找不到与此相关的任何特定文档,但我相信您遇到的问题与事件 Event.ENTER_FRAME
和 Event.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]
...
Event.ENTER_FRAME
事件 从未 在场景 1 上调用。可能是因为该事件在场景 1 的代码第 1 帧执行之前已经发生。
null
引用实际上与尚未在场景 2 上初始化的 char
实例相关。一旦播放头离开帧,可能当实例能够被引用时,它读取为 MovieClip。
这些行为 [可能] 是为什么这么多人推荐使用文档 class 在必要时将对象添加到舞台,将侦听器附加到 Event.ADDED_TO_STAGE
以了解它们何时添加的原因,以便您可以在实际添加到舞台的适当时间点处理功能;而不是等待对象能够通过时间线被引用。我最好的猜测是,如果 ENTER_FRAME 事件在场景 1 上触发,它也可能会跟踪 null
到 char
,就像它在场景 2 上跟踪 null
一样。它可能是 null
,因为舞台上的显示对象尚未初始化,因此对该对象的代码引用也尚未初始化。
我希望我有更多的时间来为你调查这个问题,但这是我能想出的最好的测试和解释来描述你正在经历的行为。
干杯!
假设我们有一个 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" 的符号?
除了 Adobe 为 Event class 提供的文档外,我找不到与此相关的任何特定文档,但我相信您遇到的问题与事件 Event.ENTER_FRAME
和 Event.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]
...
Event.ENTER_FRAME
事件 从未 在场景 1 上调用。可能是因为该事件在场景 1 的代码第 1 帧执行之前已经发生。null
引用实际上与尚未在场景 2 上初始化的char
实例相关。一旦播放头离开帧,可能当实例能够被引用时,它读取为 MovieClip。
这些行为 [可能] 是为什么这么多人推荐使用文档 class 在必要时将对象添加到舞台,将侦听器附加到 Event.ADDED_TO_STAGE
以了解它们何时添加的原因,以便您可以在实际添加到舞台的适当时间点处理功能;而不是等待对象能够通过时间线被引用。我最好的猜测是,如果 ENTER_FRAME 事件在场景 1 上触发,它也可能会跟踪 null
到 char
,就像它在场景 2 上跟踪 null
一样。它可能是 null
,因为舞台上的显示对象尚未初始化,因此对该对象的代码引用也尚未初始化。
我希望我有更多的时间来为你调查这个问题,但这是我能想出的最好的测试和解释来描述你正在经历的行为。
干杯!