更平滑的 Sprite-Kit 对象移动
Smoother Sprite-Kit objects movement
我目前正在为 Mac 编写一个小乒乓球游戏,但我找不到让球拍平稳移动的方法。我使用 keyDown 函数来检测何时按下某个键(例如 W)。这将执行 运行-命令:
override func keyDown(with event: NSEvent) {
if event.keyCode == 126 {
pR.run(SKAction.move(by: CGVector(dx: 0, dy: 15), duration: 0))
}
}
问题是,当我按下向上箭头按钮 (keyCode 126) 时,我的 sprite/paddle (pR) 移动一次,如果我一直按住按钮,它就会开始连续移动。
此外,如果我有两个 if 指令(例如一个用于两个乒乓球玩家),似乎不能同时进行两个输入,也就是说,两个玩家不能按下一个按钮并期待响应。
我该如何解决这些问题?感谢所有帮助。
问题一:为什么我的球拍不顺畅?
为什么要 运行 设置持续时间为 0 的运动 SKAction?
这与改变它的 y 位置完全相同
您可以使持续时间更长,例如 0.1
如果你想这样做,你应该在每次点击 W 键时删除 p1 的 SKAction。
为什么?您不希望它同时 运行 2 个 SKActions。
(我假设 pR 是你的 player 1 paddle。我猜是 Paddle Right 的意思。)
pR.removeAllActions()
pR.run(SKAction.move(by: CGVector(dx: 0, dy: 15), duration: 0.1))
或者,如果您希望它立即生效,您可以改为这样做
(虽然你的桨会根据你的帧速率移动得很快)
pR.position.y += 15
我推荐第一个选项。
或者,如果您喜欢第二个选项,因为它更干净,您可以将 15 替换为 10 或 5。
问题二:不能同时输入两个
• 1: 你不可能同时'exact'点击2个按钮。
• 2:这是什么意思?
• 3: Swift 运行s keyDown 与您按下的第一个键。
• 4:Swift 然后 运行s keyDown 与您按下的第二个键。
(即使你认为你同时按下了两个键,但你没有。一个可能比第二个早一微秒被按下。这都是关于时间的。这对SpriteKit来说是一样的iOS, 你不能同时有两个 'touchesBegan' 输入。这种情况很少见。)
如何修复:
您应该能够为播放器 2 的另一个密钥添加第二个 'if' 语句。
示例代码(除了我使用开关来保存 space)
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,我刚刚意识到这个问题在上面的小评论部分得到了回答。好吧。
我目前正在为 Mac 编写一个小乒乓球游戏,但我找不到让球拍平稳移动的方法。我使用 keyDown 函数来检测何时按下某个键(例如 W)。这将执行 运行-命令:
override func keyDown(with event: NSEvent) {
if event.keyCode == 126 {
pR.run(SKAction.move(by: CGVector(dx: 0, dy: 15), duration: 0))
}
}
问题是,当我按下向上箭头按钮 (keyCode 126) 时,我的 sprite/paddle (pR) 移动一次,如果我一直按住按钮,它就会开始连续移动。
此外,如果我有两个 if 指令(例如一个用于两个乒乓球玩家),似乎不能同时进行两个输入,也就是说,两个玩家不能按下一个按钮并期待响应。
我该如何解决这些问题?感谢所有帮助。
问题一:为什么我的球拍不顺畅?
为什么要 运行 设置持续时间为 0 的运动 SKAction?
这与改变它的 y 位置完全相同
您可以使持续时间更长,例如 0.1
如果你想这样做,你应该在每次点击 W 键时删除 p1 的 SKAction。 为什么?您不希望它同时 运行 2 个 SKActions。 (我假设 pR 是你的 player 1 paddle。我猜是 Paddle Right 的意思。)
pR.removeAllActions()
pR.run(SKAction.move(by: CGVector(dx: 0, dy: 15), duration: 0.1))
或者,如果您希望它立即生效,您可以改为这样做
(虽然你的桨会根据你的帧速率移动得很快)
pR.position.y += 15
我推荐第一个选项。
或者,如果您喜欢第二个选项,因为它更干净,您可以将 15 替换为 10 或 5。
问题二:不能同时输入两个
• 1: 你不可能同时'exact'点击2个按钮。
• 2:这是什么意思?
• 3: Swift 运行s keyDown 与您按下的第一个键。
• 4:Swift 然后 运行s keyDown 与您按下的第二个键。
(即使你认为你同时按下了两个键,但你没有。一个可能比第二个早一微秒被按下。这都是关于时间的。这对SpriteKit来说是一样的iOS, 你不能同时有两个 'touchesBegan' 输入。这种情况很少见。)
如何修复:
您应该能够为播放器 2 的另一个密钥添加第二个 'if' 语句。
示例代码(除了我使用开关来保存 space)
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,我刚刚意识到这个问题在上面的小评论部分得到了回答。好吧。