2D连续碰撞检测

时间:2012-03-09 01:44:37

标签: math 2d collision-detection

我正在尝试为我的乒乓游戏实现简单的连续碰撞检测,但我不确定我是否正在实施或理解这一点。 AFAIR连续碰撞检测用于快速移动的物体,可以通过另一个物体绕过正常的碰撞检测。

所以我试过的是因为我所拥有的唯一一个快速移动的物体是一个球,我只需要球的位置,它的移动速度,以及我们所比较的物体的位置。

由此我认为最好是例如如果球的移动速度指示它向左移动,我会将它的最左边界限与另一个物体的最右边界相比较。从这里我将通过将移动速度添加到球的最左边界并逐步比较以确保它比其他对象的右边界更大。这表明没有左右碰撞。

我有一些工作,但不幸的是,球开始正常弹跳一段时间,然后它就像没有任何东西时击中桨一样。

我有点失落,任何帮助都会受到赞赏!

static bool CheckContinuousCollision(PActor ball, PRect ballRect, PActor other, PRect otherRect)
{
    PVector ballMoveSpeed;
    int ballXLimit;
    int ballYLimit;

    ballMoveSpeed = ball.moveSpeed;

    // We are moving left
    if ( sgn(ball.moveSpeed.x) < 0 )
    {
        ballXLimit = std.math.abs(ballMoveSpeed.x) / 2;

        for ( int i = 0; i <= ballXLimit; i++ )
        {

                if ( ballRect.Left < otherRect.Right && otherRect.Left < ballRect.Left)
            {
                return true;
            }

            ballRect.Left -= i;
        }
    }

            //We are moving right
    if ( sgn(ball.moveSpeed.x) > 0)
    {
        ballXLimit = std.math.abs(ballMoveSpeed.x) / 2;

        for ( int i = 0; i < ballXLimit; i ++ )
        {

            if ( ballRect.Right > otherRect.Left && ballRect.Right < otherRect.Right )
            {
                return true;
            }   

            ballRect.Right += i;
        }
    }
            // we are not moving
    if ( sgn(ball.moveSpeed.x) == 0)
    {
        return false;
    }
}

1 个答案:

答案 0 :(得分:1)

你似乎正在检查只有一个维度的碰撞,即你的球与你的其他人的X维度。

你可能想要的是比较两个物体是否在二维空间中碰撞。这可以通过调整每个对象边界矩形并检查矩形是否重叠来轻松完成。然后在for循环中,您可以相应地调整Ball矩形