2011-04-29 67 views
1

我目前有一個.swf文件嵌套到另一個.swf文件中。SWF中的addEventListener嵌套

在父SWF文件中,我使用UILoader加載其他.swf文件。

uiLoader.source =「data/child.swf」;

-

在子SWF文件我有

stage.addEventListener(KeyboardEvent.KEY_DOWN,keyPressedDown);

當我運行它自己的時候,它完美的工作;但是當我通過parent.swf stage.addEvent運行child.swf ...給我一個空引用異常。

是什麼導致問題的階段部分?如果是的話,有沒有辦法解決這個問題?

+0

stage.addEvent ...你是在孩子還是父母身上跑步? – 2011-04-29 21:45:25

回答

2

好吧,這是一個很好的問題,花了我一點時間才弄明白。

基本上Flash做這個奇怪的事情(也許是一個bug?),但在實際初始化對象之前運行函數。這種情況發生在初始化舞臺上的movieclip時:

var mc:something = new something(); addChild(東西)

現在在something.as如果你有一個參考初始化函數中的一個階段,它會給null。 (參考:http://www.emanueleferonato.com/2009/12/03/understand-added_to_stage-event/

所以基本上採取的是同樣的問題,延長它的URLLoader它實際上建立了層次階段前執行代碼 - >電影剪輯

現在

,才能在解決這一問題做這樣的事情你的孩子SWF:

import flash.events.KeyboardEvent; 
import flash.events.Event; 
import flash.display.MovieClip; 

addEventListener(Event.ADDED_TO_STAGE, init); 


function init(event:Event){ 
    trace("test"); 
    stage.addEventListener(KeyboardEvent.KEY_DOWN, moveBox); 
    var testMC:test = new test(); 
    addChild(testMC); 
} 

function moveBox(event:KeyboardEvent){ 
    trace("a"); 
    testMC.x += 11; 
} 

以上是我的代碼,就可以取消大部分,但要注意的主要事情是: 的addEventListener(Event.ADDED_TO_STAGE,INIT); 在對象初始化後執行。

+0

謝謝,那正是我所需要的。 – triangulito 2011-05-02 16:10:01

+0

@triangulito你可能想要在.as上編碼,而不是在一個框架上,在這種情況下,我認爲你可以使用一個自定義的調度器,這將允許抽象,你可以從任何地方執行它。 – Saad 2011-05-03 01:03:27

+0

是的,我正在研究一個主要由設計人員完成的項目,他們很難讓他們過渡到類而不是框架編程,所以我只是一直到我們開始一個新項目。 – triangulito 2011-05-03 17:56:03

0

我不完全確定,但它可能是因爲具有事件偵聽器的MovieClip嵌套在另一個MovieClip中,所以它無法訪問'stage'對象。

有一點嘗試,會從舞臺中刪除事件監聽,因此它只是看起來像這樣:

addEventListener(KeyboardEvent.KEY_DOWN,keyPressedDown); 

可能的工作。或者,您可以將事件代碼保留在父級影片剪輯中。希望這些東西可能有所幫助

德布