我正在尝试创建一个macOS SpriteKit游戏,在该游戏中,玩家将按住箭头键以使节点(玩家)移动。当我使用 keyDown(with:) 时,我看到按住一个键时会出现第一个字符,然后有一个延迟,然后出现所有其他字符。诸如此类:第一个字符> 延迟> 字符,直到停止按住键为止
这是我的keyDown代码:
override func keyDown(with event: NSEvent) {
switch event.keyCode {
/*
case 0x31:
if let label = self.label {
label.run(SKAction.init(named: "Pulse")!, withKey: "fadeInOut")
}
*/
case 0x7C: // Right Arrow
print("RightArrow pressed!")
playerNode.run(SKAction.moveTo(x: playerNode.position.x + 7, duration: 0.1))
case 0x7B: // Left Arrow
print("LeftArrow pressed!")
playerNode.run(SKAction.moveTo(x: playerNode.position.x - 7, duration: 0.1))
case 0x7E: // Up Arrow
print("UpArrow pressed!")
playerNode.run(SKAction.moveTo(y: playerNode.position.y + 7, duration: 0.1))
case 0x7D: // Down Arrow
print("DownArrow pressed!")
playerNode.run(SKAction.moveTo(y: playerNode.position.y - 7, duration: 0.1))
default:
print("keyDown: \(event.characters!) keyCode: \(event.keyCode)")
}
}
有人知道如何让我的SpriteNode平稳移动吗?
谢谢!
编辑:由于我的问题被设置为重复,因此我想详细解释一下。.我看到了建议的答案,但实际上并没有帮助我...答案是创建一个时间,我做了:
var myTimer = Timer()
然后,在我的开关盒0x7C中(在文本中较高的位置),我添加了此内容:
myTimer = Timer.scheduledTimer(timeInterval: 0.0, target: self, selector: #selector(GameScene.movePlayerRight), userInfo: nil, repeats: false)
然后,我创建了selector
调用的函数:
@objc func movePlayerRight() {
playerNode.run(SKAction.moveTo(x: playerNode.position.x + 7, duration: 0.1))
}
所以是的。。。这就是我现在的位置。我尝试了一些事情:将计划的计时器重复设置为true
,然后在键按下时执行myTimer.invalidate()
。它工作得很好,我就像:O ...但是当您长时间按下该键时,SpriteNode不会停止移动,所以我猜想Timer不会失效...
如果对此一无所知或想出可能的答案,请告诉我!
谢谢!