2011-01-14 78 views
2

我有一個Sprite這是一個Flex對象的孩子,並且充當主「遊戲窗口」。所以在遊戲中它應該得到鍵盤輸入,但在其他時候不應該。當我添加一個鍵盤監聽器時,它永遠不會觸發。Sprite沒有收到鍵盤事件

我是否需要停止父對象以某種方式「吃」事件或類似的東西?我用鼠標滾輪事件得到同樣的結果,但鼠標點擊事件沒有問題。 Sprite似乎沒有關注的概念,除非我錯過了它。

更普遍的是,在這種方法中,有沒有關於最佳方式的建議?例如,在進入遊戲窗口(如ESC或F1之類的遊戲窗口)之前,可能仍需要截取某些鍵......目標是遊戲窗口不知道其他用戶界面。

回答

3

你的精靈需要輸入焦點來接收鍵盤事件。

至於最佳做法:如果你的整個應用程序是基於鍵盤輸入的,如果你沒有切換上下文(相同的密鑰意味着,如果另一個對象選擇不同的事情)了很多,你可以只添加聽衆的舞臺。

否則,您可以使用stage.focus將焦點設置爲所需的對象。

+0

可悲的是,上下文的變化是可以預料的...就像一個彈出對話框或一些菜單。精靈_get_輸入如何聚焦,也許我的問題應該是什麼。 – 2011-01-14 12:27:27

+0

我編輯了我的答案。使用stage.focus :) – weltraumpirat 2011-01-14 12:29:17

0

您應該真的在監聽根應用程序或舞臺上的鍵盤事件。由於actionscript具有適當的事件冒泡,因此您可以始終確保事件會到達那裏(如果它們未被文本框或其他輸入消耗)。當你需要它們作爲精靈時,你可以通過向舞臺添加事件偵聽器來將它們直接模擬到精靈上,當你不需要時將它們從舞臺上移除。

或者您可以將關鍵聽衆保留在舞臺上,並在應用程序的上下文更改時更改context變量。然後,您在應用程序的context上調整事件偵聽器的操作。這樣做的一個主要優點是所有的關鍵事件邏輯都在同一個地方,並且可以更容易地進行調試。

至於鼠標滾輪,如果您打算將遊戲嵌入其他網站,您可能不用擔心。他們可能不會讓你安裝一些js hack讓它在mac上工作。否則是的,在Mac OS上獲取SWFObject附加組件:MouseWheel。

1

爲了讓您的精靈集中精力,您需要實現界面mx.managers.IFocusManagerComponent。否則tab鍵在精靈上不起作用。根據adobe文檔:

IFocusManagerComponent接口定義可聚焦組件必須實現的接口,才能從FocusManager接收焦點。

您可以查看UIComponent中的代碼以瞭解它們如何實現在IFocusManagerComponent中定義的函數。