你不应该当一个键被滥用键盘重复以重复运行的代码。相反,请记住自己使用keyDown
和keyUp
自己按下哪些按键。
要做到这一点,最简单的方法是使用实例变量:
var leftPressed = false
var rightPressed = false
var upPressed = false
var downPressed = false
你也可以使用一个enum
,关键代码的阵列,或任何最适合您的应用程序。
在keyDown
和keyUp
,设置或清除键按下标志。您可以使用switch
/case
更加简练使这些功能,如果你import Carbon.HIToolbox
,你就会有一些可用于虚拟键码常量:
override func keyDown(with event: NSEvent) {
switch Int(event.keyCode) {
case kVK_LeftArrow:
leftPressed = true
case kVK_RightArrow:
rightPressed = true
case kVK_UpArrow:
upPressed = true
case kVK_DownArrow:
downPressed = true
default:
break
}
}
override func keyUp(with event: NSEvent) {
switch Int(event.keyCode) {
case kVK_LeftArrow:
leftPressed = false
case kVK_RightArrow:
rightPressed = false
case kVK_UpArrow:
upPressed = false
case kVK_DownArrow:
downPressed = false
default:
break
}
}
然后,在你update
方法更新播放器的位置:
var lastUpdate: TimeInterval!
func update(currentTime: TimeInterval) {
defer { lastUpdate = currentTime }
guard lastUpdate != nil else {
return
}
let dt = currentTime - lastUpdate
guard dt < 1 else {
return //so nothing "jumps" when the the game is unpaused
}
if leftPressed {
player.position.x -= 10 * dt
}
if rightPressed {
player.position.x += 10 * dt
}
if upPressed {
player.position.y -= 10 * dt
}
if downPressed {
player.position.y += 10 * dt
}
}
好的,这一切都有道理,但什么是kVK_Arrow?这是从Carbon.HIToolbox导入的东西吗? – Elijah
@Elijah Yep; Carbon包含每个键的虚拟键码常量。见http://stackoverflow.com/questions/3202629/where-can-i-find-a-list-of-mac-virtual-key-codes – NobodyNada
这就是我的想法,但它仍然给我一个错误后,我导入它。 – Elijah