【问题标题】:Smoother Sprite-Kit objects movement更平滑的 Sprite-Kit 对象移动
【发布时间】:2020-08-12 05:10:52
【问题描述】:

我目前正在为 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)时,我的精灵/桨(pR)移动一次,如果我一直按住按钮,它就会开始连续移动。

另外,如果我有两个 if 指令(例如两个乒乓球玩家一个),似乎不能同时进行两个输入,也就是说,两个玩家都不能按下按钮并且期待回应。

我该如何解决这些问题?感谢所有帮助。

【问题讨论】:

  • 在 keyDown 上仅将键存储在数组中并在 keyUp 上从数组中删除,然后在更新时使用数组并执行操作:)
  • 谢谢。效果很好!

标签: swift macos sprite-kit pong


【解决方案1】:

问题 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,我刚刚意识到这个问题在上面的小评论部分得到了回答。哦,好吧。

【讨论】:

  • 非常感谢您的帮助。即使我已经解决了这些问题,这也很有帮助。我会接受这个作为答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多