Swift Pong(No SpriteKit):检测球击中的球拍面

时间:2019-07-02 16:02:06

标签: swift collision-detection pong

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

2 个答案:

答案 0 :(得分:0)

如果rect1和rect2均为CGRect,则可以通过...获得中点。

rect1.midY

rect2.midY

然后您可以确定中点球(无论是哪个球)是高于还是低于桨叶的中点。

if rect1.midY >= rect2.midY

等等...

请注意,使用SpriteKit会更好。但是,如果您只是为了娱乐而做,那就继续吧。希望能解决。 :-)

答案 1 :(得分:0)

我找到了一个不错的(但不是很好)的解决方案。如果球触碰球拍的左侧或右侧,则此函数返回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”部分是硬编码的。因此,如果球速度太快或增量太大,则条件语句可能变得混乱。总体而言,它运行良好。