2017-03-09 199 views
2

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

这就是我目前正在阅读的箭头键。

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

你不应该当一个键被滥用键盘重复以重复运行的代码。相反,请记住自己使用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 
    } 
} 
+0

好的,这一切都有道理,但什么是kVK_Arrow?这是从Carbon.HIToolbox导入的东西吗? – Elijah

+0

@Elijah Yep; Carbon包含每个键的虚拟键码常量。见http://stackoverflow.com/questions/3202629/where-can-i-find-a-list-of-mac-virtual-key-codes – NobodyNada

+0

这就是我的想法,但它仍然给我一个错误后,我导入它。 – Elijah