Swift Pong(无 SpriteKit):检测球击中的桨的一侧

Swift Pong(No SpriteKit): Detect side of paddle that the ball hit

目前,我正在 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。

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

rect1.midY

rect2.midY

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

if rect1.midY >= rect2.midY

等等...

附带说明一下,您最好为此使用 SpriteKit。但如果你只是为了好玩而这样做,那就继续吧。希望一切顺利。 :-)

我找到了一个不错的(但不是很好)解决方案。此函数 returns 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
}

此函数的主要问题是 "less than 1" 部分是硬编码的。因此,如果球速度太快,或者增量太大,条件语句可能会变得混乱。不过,总的来说,它工作得很好。