Swift SpriteKit中的箭头键
在Xcode中,sprite套件是否具有任何类型的内置箭头键支持?我目前正在使用常规的swift钥匙代码,持有钥匙时会有延迟。这使得我的游戏控制变得困难 这就是我目前阅读箭头键的方式Swift SpriteKit中的箭头键,swift,sprite-kit,Swift,Sprite Kit,在Xcode中,sprite套件是否具有任何类型的内置箭头键支持?我目前正在使用常规的swift钥匙代码,持有钥匙时会有延迟。这使得我的游戏控制变得困难 这就是我目前阅读箭头键的方式 override func keyDown(with event: NSEvent) { let keycode = event.keyCode if(keycode == 125)//up { player.position.y -= 10 } el
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
}
我知道这是一个愚蠢的问题,但我是swift的新手,我找不到这个问题的任何其他答案。你不应该滥用键盘重复,以便在按住键时重复运行代码。相反,使用
keyDown
和keydup
跟踪自己按下的键
最简单的方法是使用实例变量:
var leftPressed = false
var rightPressed = false
var upPressed = false
var downPressed = false
您还可以使用enum
、一组键代码或任何最适合您的应用程序的代码
在keyDown
和keydup
中,设置或清除按键标志。使用开关
/外壳
,您可以使这些功能更加简洁,如果导入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
}
}
var lastUpdate:TimeInterval!
func更新(当前时间:时间间隔){
延迟{lastUpdate=currentTime}
guard lastUpdate!=无其他{
返回
}
设dt=currentTime-lastUpdate
防护装置dt<1其他{
return//因此当游戏未暂停时,不会有任何“跳跃”
}
如果左键按下{
玩家位置x-=10*dt
}
如果按下右键{
玩家位置x+=10*dt
}
如有必要{
玩家位置y-=10*dt
}
如果按下{
玩家位置y+=10*dt
}
}
Ok,这一切都有道理,但kVK\U箭头是什么?那是从Carbon.HIToolbox进口的吗?@Elijah Yep;Carbon包含每个键的虚拟键代码常量。看,这就是我的想法,但在我导入它之后,它仍然给了我一个错误。@Elijah error?怎么了?我刚刚意识到我把kVK_DownArrow
(我有kVK_DownArrow
);现在可以工作了吗?类型为“Int”的表达式模式无法与类型为“UInt16”的值匹配