【问题标题】:mac Swift multiple keyDown eventsmac Swift多个keyDown事件
【发布时间】:2015-06-07 02:51:55
【问题描述】:

我正在 swift 中为 Mac OSX 创建一个基于 2D 瓷砖的平台游戏。当一次按下多个键时,我遇到了控件问题。例如;如果'D'让角色向右移动,'W'让他跳;如果我按住'D'让角色奔跑,然后点击'W'让他跳起来,他一落地就会停下来。他继续向右移动的唯一方法是再次修饰“D”,这当然是不可取的。看起来好像当按下“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")
        }
}

【问题讨论】:

  • 这似乎是硬件的工作原理。我在带有 USB 键盘的 PC 上得到了相同的行为。

标签: macos swift controls keydown


【解决方案1】:

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

如果您按下一个键,它的制造代码就会发送到计算机。当您按住一个键时,该键变为打字键,这意味着键盘将继续发送该键的 make 代码,直到该键被释放或按下另一个键。要验证这一点,请打开文本编辑器并按住“A”键。 ... 打字数据不在键盘内缓冲。在按下多个键的情况下,只有最后按下的键变为打字键。当释放该键时,打字重复然后停止,即使其他键可能被按住。

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

在您描述的情况下,出现问题是因为即使您按住D,当您按下W 时,键盘也会停止重复D 键。事件顺序是:

Keydown D
Keydown D
...
Keydown W
Keyup   W

此时键盘事件停止。请注意Keyup D 没有发生,所以您实际上知道D 键仍然按下,但现在由您来模拟重复按键。

我建议您研究如何在键盘硬件中完全禁用自动重复(或者只是忽略按键重复事件)并自己生成所需的游戏行为。您可以通过使用Keydown 和Keyup 事件跟踪每个键的状态轻松做到这一点,忽略重复的Keydown。

【讨论】:

    【解决方案2】:

    Jim Garrison 的回答似乎是正确的。在这种情况下,一种解决方法是,当您按下 D 键时让角色向右移动,然后使用循环继续向右移动直到释放 D 键,您可以使用 func keyUp(theEvent: NSEvent) 检查

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-05
      • 2013-03-18
      相关资源
      最近更新 更多