2015-04-03 57 views
0

说我们有一个flash文件,所有文件上的代码和对象描述如下:重仓股场景(发生了什么事我的符号?)

场景一:

只有一个符号实例名称为“炭”是在舞台上

代码场景一:

import flash.events.Event; 

stage.addEventListener(Event.ENTER_FRAME,update); 
function update(e:Event){ 
    trace(char); 
} 

play(); 

场景二:

只有一个实例名称为“炭”符号在舞台上

代码场景二:

stop(); 

如果你尝试了这一点你自己,您会发现闪光灯将对象char在分割时刻追踪为“null”,然后在发现第二个场景中的符号后正确追踪它。有谁知道这是为什么,因为在连续场景中都有一个带有实例名称“char”的符号?

回答

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. Event.ENTER_FRAME事件从未呼吁场景1。可能是因为该事件已发生在场景1上的代码之前,帧1正在执行。
  2. null引用实际上是与在场景2上尚未初始化的char实例有关。一旦播放头退出帧,可能在实例能够被引用时,它将作为MovieClip读取。

这些行为[大概]为什么这么多的人建议使用文档类在必要时添加对象在舞台上,连接监听器的Event.ADDED_TO_STAGE知道什么时候加入他们,这样就可以处理功能的原因在适当的时间点,他们实际上被添加到舞台上;而不是等待对象能够通过时间线被引用。我最好的猜测是,如果ENTER_FRAME事件在场景1上触发,它可能跟踪nullchar,就像在场景2上跟踪null一样。它可能是null,因为舞台上的显示对象尚未初始化所以对该对象的代码引用还没有初始化。

我希望我有更多的时间去为你调查这件事,但这是我可以用来描述你所遇到的行为的最佳测试和解释。

干杯!

+1

谢谢,这正是我所寻找的 – DrakeTruber 2015-04-06 00:06:45

+1

不客气!我在前几段提炼了一些我的陈述,以澄清场景1帧1上的ENTER_FRAME事件发生了什么。 – 2015-04-06 16:42:09