iPhone Pong碰撞检测

时间:2009-10-13 21:56:09

标签: iphone collision-detection

我有一个问题,如果球刚刚击中球拍,它会被锁在内部并且无法释放。它有时发生在玩家桨上,但由于你可以控制它,所以你需要做的就是移动它并且它会逃脱。计算机完美地跟随球,所以一旦它进入它就永远无法逃脱,导致happens in this video。现在这只发生在我增加帧速率时,如果它真的很低,它有点,错误输出并且“穿过”桨,导致获得一个点。至少在这种情况下,它不是一个明显的错误,游戏继续发挥。

当然,我希望帧速率尽可能平滑......所以要对它进行排序。这是我非常简单的碰撞检测的代码。使用UIImageViews。

if (CGRectIntersectsRect (ball.frame, playerPaddle.frame))
    {
        if (ball.center.y < playerPaddle.center.y) //hits the "top" of the computer paddle
        {
            AudioServicesPlaySystemSound (hitSound);
            ballVelocity.y = -ballVelocity.y; // turn ball around if collide
        }
    }

    if (CGRectIntersectsRect (ball.frame, computerPaddle.frame))
    {
        if (ball.center.y > computerPaddle.center.y) //hits the "bottom" of the computer paddle
        {
            AudioServicesPlaySystemSound (hitSound);
            ballVelocity.y = -ballVelocity.y; // turn ball around if collide
        }
    }

感谢您的帮助。

5 个答案:

答案 0 :(得分:4)

没有看到你的其余代码,这只是一个猜测,但可能发生的是球的速度不断地来回翻转。你需要在击球后将球移到球拍外面,或者“碰撞之间的最短时间”

答案 1 :(得分:3)

除了上面的答案之外,你的球应该永远不会被允许实际进入球拍。具体来说,如果球在桨内,您应该在切换其y速度的同时将其位置重置到桨的外部。

具体做法是:

if (CGRectIntersectsRect (ball.frame, playerPaddle.frame))
{
    AudioServicesPlaySystemSound (hitSound);
    CGRect frame = ball.frame;
    frame.origin.y = playerPaddle.frame.origin.y - frame.size.height;
    ball.frame = frame;
    ballVelocity.y = -ballVelocity.y; // turn ball around if collide
}

if (CGRectIntersectsRect (ball.frame, computerPaddle.frame))
{               
    AudioServicesPlaySystemSound (hitSound);
    CGRect frame = ball.frame;
    frame.origin.y = CGRectGetMaxY(computerPaddle.frame);
    ball.frame = frame;
    ballVelocity.y = -ballVelocity.y; // turn ball around if collide
}

答案 2 :(得分:0)

需要一个额外的条件。

if (ballVelocity.y > 0 && CGRectIntersectsRect (ball.frame, playerPaddle.frame))
    {
        if (ball.center.y < playerPaddle.center.y) //player
        {
            AudioServicesPlaySystemSound (volleyFileID);
            ballVelocity.y = -ballVelocity.y;
        }
    }

    if (ballVelocity.y < 0 && CGRectIntersectsRect (ball.frame, computerPaddle.frame)) //computer
    {
        if (ball.center.y > computerPaddle.center.y)
        {
            AudioServicesPlaySystemSound (volley2FileID);
            ballVelocity.y = -ballVelocity.y;
        }
    }

答案 3 :(得分:0)

我认为处理它的最简单方法是添加逻辑,以便在与桨碰撞后,球的速度矢量总是指向远离桨的中心点。这样,即使球“与球拍再次碰撞”(因为它在内部太远以至于在事件循环的下一个嘀嗒声中再次离开),它将在第二次“反弹”之后继续远离桨。

答案 4 :(得分:0)

这个问题类似于我在球拍内被抓住的问题。我解决这个问题的方法是创建一个布尔值。发生冲突时,布尔值设置为true。当球击中墙壁时,布尔值设置为false。在我们检查Rectangle Intersection的条件语句中,我添加一个检查以查看collision是否设置为false。

所以,最终会发生什么:

  • 球击中球拍,布尔值设为真。
  • 球上的速度反转
  • 当碰撞检测尝试执行时,它不会,因为布尔值为真
  • 球从墙上反弹,布尔值重置为假
  • 球碰撞另一个球拍,布尔值再次设为真

试试这个,让我知道它是如何运作的。

布兰登