键盘作为游戏控制器,处理 Swift 中的多个键

Keyboard as game controller, handling multiple keys in Swift

我正在尝试用键盘让飞船在屏幕上移动。我设法处理了按键事件,但我注意到当同时按下多个按键时,它不会正确运行,只有一个具有优先权。我正在使用 switch 语句,因为我认为 keyDown 函数为每个键调用一次,但即使我在这些情况下明确添加 fallthrough ,也不会更好。有没有人经历过类似的事情,有没有更好的方法将键盘用作控制器?

override func keyDown(with event: NSEvent) {

      switch event.keyCode {
      case 0x31:
         if let playerShip = self.playerShip {
            playerShip.run(SKAction.init(named: "Pulse")!, withKey: "fadeInOut")
         }
      case 123:
         if let playerShip = self.playerShip {
            playerShip.run(SKAction.applyAngularImpulse(0.001, duration: 0.1))
         }
      case 124:
         if let playerShip = self.playerShip {
            playerShip.run(SKAction.applyAngularImpulse(-0.001, duration: 0.1))
         }
      case 125:
         if let playerShip = self.playerShip {
            playerShip.run(SKAction.applyImpulse(CGVector.init(angle: playerShip.zRotation).opposite(), duration: 0.1))
         }
      case 126:
         if let playerShip = self.playerShip {
            playerShip.run(SKAction.applyImpulse(CGVector.init(angle: playerShip.zRotation), duration: 0.1))
         }
      default:
         print("keyDown: \(event.characters!) keyCode: \(event.keyCode)")
      }
   }

我的猜测是,即使您的代码完全按照您描述的方式工作,实际上玩您的游戏的任何人都很难同时按下两个键。一个键几乎总是先于另一个键被敲击。因此,也许您可​​以实现它,以便捕获一个关键事件,然后在第一个事件发生后的短时间内 window 内寻找第二个事件(在第一个事件发布之前)。

每次按下一个键时,OS X 应该调用 keyDown 方法。如果按下两个键,它会被调用两次,等等。也许您看到此行为是因为只有最后一个键的操作会覆盖第一个键的操作?

在测试了一些东西以确保我的 SKActions 不是问题的原因之后,我想起了我在 Delphi 使用 DelphiX 和 GLScene 编写代码的那些日子里的一些事情.我知道它是 PC,但它是相关的。

问题是键盘事件提示只会重新触发按下的 las 键。因此,使用向上箭头施加力并按住它以加速将起作用,直到我按下,例如,向左箭头施加一些扭矩。然后左箭头键将被重新触发,但是下一个来自向上箭头的事件,即使它现在仍然被按下,也将是您真正释放它的时候。因此,飞船将开始旋转但会停止加速,因为不会为向上箭头重新触发 keyDown 事件。

这就是为什么您需要一种方法来跟踪按键状态,这样您就可以检查在任何给定时刻是否同时按下了多个按键。

这也是我要构建我的键盘管理器的原因 class。