【问题标题】:Swift Pong(No SpriteKit): Detect side of paddle that the ball hitSwift Pong(No SpriteKit):检测球击中的桨侧
【发布时间】:2019-07-02 16:02:06
【问题描述】:

目前,我正在用 Swift(没有 SpriteKit)制作一个单人乒乓球游戏:球可以从视图的各个方向反弹。经过一番研究,我用这个算法来检测碰撞:

if (rect1.x < rect2.x + rect2.width &&
    rect1.x + rect1.width > rect2.x &&
    rect1.y < rect2.y + rect2.height &&
    rect1.y + rect1.height > rect2.y) {
        // collision detected!
}

这很好用,但是我如何检测球击中了球拍的哪一侧?

我需要知道这一点,因为:如果球击中球拍的底部或顶部,我会将 y 增量乘以 -1。如果球击中球拍的左侧或右侧,我会将 x 增量乘以 -1。

【问题讨论】:

    标签: swift collision-detection pong


    【解决方案1】:

    如果 rect1 和 rect2 都是 CGRect 那么你可以用...得到中点

    rect1.midY
    

    rect2.midY
    

    然后您可以找到中点球(无论是哪个)高于或低于桨的中点。

    if rect1.midY >= rect2.midY
    

    等等……

    顺便说一句,使用 SpriteKit 会更好。但如果你只是为了好玩,那就继续吧。希望它成功。 :-)

    【讨论】:

    • 您好,感谢您的回答。如果我使用if rect1.midY &gt;= rect2.midY,球不会接触球拍的左侧或右侧吗?
    • 您只提到要检测顶部还是底部?如果你想检测左右,你可以使用 midX 代替。哦,请阅读您问题的最后一部分。是的,你也可以使用 midX,逻辑是一样的
    • 就我而言,球可以击中球拍的任何面。我该怎么办?
    • 然后检查 midY 以更新 y 速度。然后检查 midX 以更新 x。除非我误解了你所说的。乒乓球是一个定义非常明确的游戏。如果球在桨后面,它就不会反弹回来。所以它只会从一侧击中。
    • 如果你在做一些不同的事情,那么我建议添加图片来帮助解释。
    【解决方案2】:

    我找到了一个不错(但不是很好)的解决方案。如果球接触到球拍的左侧或右侧,此函数返回true,如果球接触球拍的顶部或底部,则返回false

    func touchHorizontalPaddle() -> Bool {
        if abs(ball.origin.x + ball.width - paddle.origin.x) < 1 || 
           abs(ball.origin.x - (paddle.origin.x + paddle.width)) < 1 {
            return true
        }
        return false
    }
    

    这个函数的主要问题是“小于 1”部分是硬编码的。因此,如果球速太快,或者增量太大,条件语句可能会搞砸。不过,总的来说,它的效果非常好。

    【讨论】:

      猜你喜欢
      • 2019-11-10
      • 2015-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多