2017-03-09 63 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