3

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

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)")
      }
   }
4

3 回答 3

1

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

于 2017-03-18T21:42:38.307 回答
0

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

于 2017-03-18T21:43:24.287 回答
0

在测试了一些东西以确保我的 SKActions 不是问题的原因之后,我想起了我在 Delphi 中使用 DelphiX 和 GLScene 进行编码时的一些事情。我知道它是PC,但它是相关的。

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

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

这也是我要建立我的键盘管理器课程的原因。

于 2017-03-21T06:03:41.537 回答