Swift SpriteKit中的箭头键

Swift SpriteKit中的箭头键,swift,sprite-kit,Swift,Sprite Kit,在Xcode中,sprite套件是否具有任何类型的内置箭头键支持?我目前正在使用常规的swift钥匙代码,持有钥匙时会有延迟。这使得我的游戏控制变得困难 这就是我目前阅读箭头键的方式 override func keyDown(with event: NSEvent) { let keycode = event.keyCode if(keycode == 125)//up { player.position.y -= 10 } el

在Xcode中,sprite套件是否具有任何类型的内置箭头键支持?我目前正在使用常规的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

    }

我知道这是一个愚蠢的问题,但我是swift的新手,我找不到这个问题的任何其他答案。

你不应该滥用键盘重复,以便在按住键时重复运行代码。相反,使用
keyDown
keydup
跟踪自己按下的键

最简单的方法是使用实例变量:

var leftPressed = false
var rightPressed = false
var upPressed = false
var downPressed = false
您还可以使用
enum
、一组键代码或任何最适合您的应用程序的代码

keyDown
keydup
中,设置或清除按键标志。使用
开关
/
外壳
,您可以使这些功能更加简洁,如果
导入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
    }
}
var lastUpdate:TimeInterval!
func更新(当前时间:时间间隔){
延迟{lastUpdate=currentTime}
guard lastUpdate!=无其他{
返回
}
设dt=currentTime-lastUpdate
防护装置dt<1其他{
return//因此当游戏未暂停时,不会有任何“跳跃”
}
如果左键按下{
玩家位置x-=10*dt
}
如果按下右键{
玩家位置x+=10*dt
}
如有必要{
玩家位置y-=10*dt
}
如果按下{
玩家位置y+=10*dt
}
}

Ok,这一切都有道理,但kVK\U箭头是什么?那是从Carbon.HIToolbox进口的吗?@Elijah Yep;Carbon包含每个键的虚拟键代码常量。看,这就是我的想法,但在我导入它之后,它仍然给了我一个错误。@Elijah error?怎么了?我刚刚意识到我把
kVK_DownArrow
(我有
kVK_DownArrow
);现在可以工作了吗?类型为“Int”的表达式模式无法与类型为“UInt16”的值匹配