在Xcode中,sprite-kit是否有任何类型的内置箭头键支持?我目前正在使用常规的swift键代码,并且在按住键时会有延迟。这使我的游戏控制变得困难。
这就是我目前正在阅读箭头键的方式。
override func keyDown(with event: NSEvent) {
let keycode = event.keyCode
if(keycode == 125)//up
{
player.position.y -= 10
}
else if(keycode == 126)//down
{
player.position.y += 10
}
if(keycode == 124)//right
{
player.position.x += 10
}
else if(keycode == 123)//left
{
player.position.x -= 10
}
我知道这是一个愚蠢的问题,但我是一个快速的新手,我找不到这个问题的任何其他答案。
答案 0 :(得分:1)
当按住某个键时,你不应该滥用键盘重复来重复运行代码。相反,请使用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
}
}