在 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)
我知道这是一个愚蠢的问题,但我是斯威夫特的新手,我找不到这个问题的任何其他答案。
您不应该滥用键盘重复来在按住某个键时重复运行代码。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)
| 归档时间: |
|
| 查看次数: |
2638 次 |
| 最近记录: |