2015-04-03 20 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