SpriteKit 中的箭头键

Big*_*apa 3 sprite-kit swift

在 Xcode 中,sprite-kit 是否有任何类型的内置箭头键支持?我目前正在使用常规的快速键代码,并且按住该键时会出现延迟。这使得我的游戏控制变得困难。

这就是我目前阅读箭头键的方式。

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

    }
Run Code Online (Sandbox Code Playgroud)

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

Nob*_*ica 5

您不应该滥用键盘重复来在按住某个键时重复运行代码。keyDown相反,您可以使用和来跟踪自己按下了哪些键keyUp

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

var leftPressed = false
var rightPressed = false
var upPressed = false
var downPressed = false
Run Code Online (Sandbox Code Playgroud)

您还可以使用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
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,在您的方法中更新玩家的位置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
    }
}
Run Code Online (Sandbox Code Playgroud)