2013-03-26 33 views
0

我知道是不是最好的做法,但在這個例子中,我必須繼續這樣的方法:dispatchEvent時間線

在我的時間表,我有這樣的:

addEventListener(KeyboardEvent.KEY_DOWN,handler); 
function handler(event:KeyboardEvent){ 
    if(event.charCode == 13){ 
     trace('enter pressed'); 
    } 
} 

只是一個很簡單的輸入關鍵聽衆。在一類有時一個動作被觸發,我需要模擬從類在時間軸上輸入按鍵:

case 'enter': 
{ 
    trace('it works!'); 
    dispatchEvent(new KeyBoardEvent(KeyBoardEvent.ENTER));  
    return; 
} 

我知道的情況下被觸發bucause我看到的跟蹤味精。但是我的處理函數沒有被觸發。我該如何解決這個問題?簡而言之,我唯一需要的是從外部類中執行位於我的時間軸中的函數。

+0

_KeyboardEvent_沒有靜態屬性_ENTER_,你的代碼將不會被編譯,請嘗試一些如下所示:_new KeyboardEvent(KeyboardEvent.KEY_DOWN,false,false,0,Keyboard.ENTER); _ – fsbmain 2013-03-26 13:02:23

回答

1

您需要將dispatchEvent對象添加到偵聽器。
在excample如果您:
addEventListener(KeyboardEvent.KEY_DOWN,handler);
是在主時間軸你應該寫
MovieClip(root).dispatchEvent(new KeyBoardEvent(KeyBoardEvent.KEY_DOWN));
當你從另一個影片剪輯調度,或對象添加到根。

+0

that給我︰69行\t 1180:調用可能未定義的方法MovieClip。 – DomingoSL 2013-03-26 13:17:28

+0

類派生對象。它通過'addChild()'添加到根目錄嗎?如果不是那意味着你的對象沒有看到根目錄,並且不能識別MovieClip(root)投射。 – jaku 2013-03-26 13:35:57

+0

如果你想執行addChild這個類的實例,我忘了你需要從MovieClip/Sprite中發佈你的類。 – jaku 2013-03-26 13:49:15

0

你的問題是你有一個設計缺陷,而不是代碼問題。你有想要發生的事情。有時候,你想讓它發生是因爲按下了一個鍵。有時候你想讓它出於其他原因。

當你看起來像這樣,現在很明顯這是業務邏輯,而不是在視圖應該決定的事情領域。 「某事」也可能不是視圖的責任。你沒有說過它是什麼,所以根據你的問題沒有辦法真正知道。讓我們假設它是一個View的責任。

現在,如果您在視圖中添加了something()方法,那麼負責生成「假」事件問題的一方現在可以調用該方法來響應您需要的任何條件。該派對可能還會在中扮演一個角色,使其有意識地觀看KEY_DOWN事件的舞臺,否則它可能不會。通過簡化視圖上的API,您可以使父視圖或單獨的控制器在不影響視圖中的邏輯的情況下處理此視圖。

另一個可能的解決方案是更先進一點,那就是創建一個新的EventDispatcher,您提供給您希望能夠通信的所有實例。在這個模型中,你的View會監聽EventDispatcher上的DO_SOMETHING事件,然後做一些事情。這個DO_SOMETHING將作爲鍵盤事件的結果,您想要處理的其他條件或任何將導致「某事」的未來要求發送。