mac Swift多个keyDown事件

时间:2015-06-07 02:51:55

标签: macos swift controls keydown

我正在为swift中的Mac OSX创建基于2D平铺的平台游戏。当一次按下多个键时,我遇到了控件的问题。例如;如果' D'让角色向右移动,并且' W'让他跳;如果我持有' D'让角色跑,然后点击“W'为了让他跳起来,一旦他降落就会停下来。他继续向右移动的唯一方法是修饰' D' D'再次,这当然是不可取的。看起来好像什么时候W' W'按下键,它取消了' D' keyDown事件。如果有人有任何关于如何制作它的建议,以便可以按下多个键而不取消其他类似的事件,我肯定会很感激。 这就是我的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")
        }
}

2 个答案:

答案 0 :(得分:3)

键按下时发生的重复keydown事件由键盘硬件生成。在PC上,协议定义说:

  

如果按某个键,其生成代码将发送到计算机。当您按住某个键时,该键将成为键控键,这意味着键盘将继续发送该键的make代码,直到释放键或按下其他键为止。要验证这一点,请打开文本编辑器并按住“A”键。 ...键盘内没有缓冲类型数据。在按下多个键的情况下,仅按下的最后一个键变为键控。然后,当释放该键时,Typematic repeat会停止,即使其他键可能被按下。

由于PC和Mac都可以使用相同的USB键盘(以某些键重映射为模),我很确定它们都使用相同的协议。

如果您描述,则会出现问题,因为即使您按住D,当您点击W时,键盘也会停止重复D键。事件的顺序是:

Keydown D
Keydown D
...
Keydown W
Keyup   W

此时键盘事件停止。请注意,Keyup D尚未发生,因此您实际上知道D键仍然处于关闭状态,但现在由您来模拟重复的按键。

我建议你研究如何在键盘硬件中完全禁用自动重复(或者只是忽略键重复事件)并自己生成所需的游戏行为。您可以通过使用KeydownKeyup事件跟踪每个密钥的状态来轻松完成此操作,而忽略重复的Keydown

答案 1 :(得分:0)

吉姆加里森的回答似乎是正确的。在这种情况下的解决方法可能是当你按下D键时让角色向右移动,并继续向右移动直到D键被释放,你可以使用func keyUp(theEvent:NSEvent)来检查

如果使用SpritKit,您可以在使用keyDown和keyUp方法中设置的bool时在update方法中进行角色移动。