SpriteKit中的箭头键

时间:2017-03-09 21:41:18

标签: swift sprite-kit

在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

    }

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

1 个答案:

答案 0 :(得分:1)

当按住某个键时,你不应该滥用键盘重复来重复运行代码。相反,请使用keyDownkeyUp跟踪自己按下哪些键。

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

var leftPressed = false
var rightPressed = false
var upPressed = false
var downPressed = false

您还可以使用enum,一系列密钥代码或任何最适合您应用的代码。

keyDownkeyUp中,设置或清除按键标记。您可以使用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
    }
}