2015-06-07 47 views
1

我正在爲swift創建一個基於2D瓦片的平臺遊戲,用於Mac OSX。當一次推送多個按鍵時,我遇到了控件的問題。例如;如果'D'使角色向右移動,'W'使他跳躍;如果我拿着'D'讓角色跑,然後點擊'W'讓他跳,他一旦着陸就會停下來。他繼續向右移動的唯一方法是再次潤飾'D',這當然是不可取的。看起來好像按下'W'鍵時,它取消了'D'keyDown事件。如果任何人有任何建議,我可以做到這一點,以便可以按下多個鍵而不取消其他類似的事件,我當然會感激。 這是我的KeyDown事件的外觀:mac swift多個keyDown事件

func returnChar(theEvent: NSEvent!) -> Character?{ 
     let s: String = theEvent.characters! 
     for char in s { 
      return char} 
     return nil 
} 

override func keyDown(theEvent: NSEvent) { 
       let s: String = String(self.returnChar(theEvent)!) 
       switch(s){ 
    case "w": 
     player.jump() 
    case "s": 
     // nothing yet 
    case "d": 
     player.moveLeftOrRight(CGVector(dx: 1.0, dy: 0.0)) 
    case "a": 
     player.moveLeftOrRight(CGVector(dx: -1.0, dy: 0.0)) 



    default: 
      println("default") 
     } 
} 
+0

這似乎是硬件的工作原理。我在具有USB鍵盤的PC上獲得相同的行爲。 –

回答

2

當一個鍵被按下時發生反覆的keydown事件由鍵盤硬件產生。在PC上,協議定義如下所示:

如果您按下某個鍵,則會將其編碼發送到計算機。當您按住某個鍵時,該鍵變爲輸入形式,這意味着鍵盤將繼續發送該鍵的製造代碼,直到釋放鍵或另一個鍵被按下。要驗證這一點,請打開文本編輯器並按住「A」鍵。 ... Typematic數據不在鍵盤內緩衝。在按下多個按鍵的情況下,只有最後按下的按鍵變爲輸入。鍵盤重複然後停止,當這個鍵被釋放,即使其他鍵可能被按下。

由於PC和Mac都可以使用相同的USB鍵盤(以某些鍵重新映射爲模),所以我很確定它們都使用相同的協議。

在你描述的情況下,問題的發生是因爲即使你按住D,當你點擊W時,鍵盤停止重複D鍵。事件的順序是:

Keydown D 
Keydown D 
... 
Keydown W 
Keyup W 

並且此時鍵盤事件停止。請注意,Keyup D尚未發生,所以您確實知道D鍵仍然關閉,但現在由您來模擬重複的按鍵。

我建議你研究如何在鍵盤硬件中完全禁用自動重複(或者只是忽略關鍵重複事件)並自行生成所需的遊戲行爲。您可以通過使用KeydownKeyup事件跟蹤每個密鑰的狀態輕鬆完成此操作,而忽略重複的Keydown