问题 1:为什么我的桨移动不顺畅?
为什么要运行持续时间为 0 的运动 SKAction?
这与更改它的 y 位置完全相同
你可以让持续时间更长,比如 0.1
如果你想这样做,你应该在每次点击 W 键时移除 p1 的 SKAction。
为什么?您不希望它同时运行 2 个 SKAction。
(我假设 pR 是你的玩家 1 桨。我猜它代表 Paddle Right。)
pR.removeAllActions()
pR.run(SKAction.move(by: CGVector(dx: 0, dy: 15), duration: 0.1))
或者,如果您希望它立即生效,您可以改为这样做
(虽然你的桨会根据你的帧速率快速移动)
pR.position.y += 15
我推荐第一个选项。
或者,如果您喜欢第二个选项,因为它更干净,您可以将 15 替换为 10 或 5。
问题2:不能同时进行两个输入
• 1:您不可能同时“精确”单击 2 个按钮。
• 2:这是什么意思?
• 3:Swift 使用您按下的第一个键运行 keyDown。
• 4:Swift 然后使用您按下的第二个键运行 keyDown。
(即使你认为你同时按下了两个键,你也没有。一个可能在第二个之前一微秒被按下。这都是关于时间的。iOS 上的 SpriteKit 也是如此,你不能有两个'touchesBegan' 同时输入。这非常罕见。)
如何解决:
您应该能够为玩家 2 的另一个键添加第二个“if”语句。
示例代码(除了我使用了开关来节省空间)
override func keyDown(with event: NSEvent) {
switch Int(event.keyCode) {
// W Key
case 13: // (Player 1 moves up)
// S Key
case 1: // (Player 1 moves down)
// I Key
case 34: // (Player 2 moves up)
// K Key
case 40: // (Player 2 moves down)
// Someone clicked the wrong key
default: return
}
}
你猜怎么着!这段代码^^^几乎可以工作。我还没有回答你的第三个问题。
问题 3:桨移动一次,停止,然后开始连续移动
这显然是 keyDown 函数的工作方式。
这是我的建议:
• 在变量中跟踪已按下的键
• 使用“keyUp”功能删除那些存储的值。
这是如何工作的?
var keysPressed: Set<Int> = []
override func keyDown(with event: NSEvent) {
keysPressed.insert(event.keyCode)
}
override func keyUp(with event: NSEvent) {
keysPressed.remove(event.keyCode)
}
override func update(_ currentTime: TimeInterval) {
for i in keysPressed {
// Put my Movement Switch Statement In Here
}
}
我希望这会有所帮助!如果您有任何问题,请随时回复。
Snap,我刚刚意识到这个问题在上面的小评论部分得到了回答。哦,好吧。