2D连续碰撞检测

6
我正在尝试为我的乒乓球游戏实现简单的连续碰撞检测,但我不确定我是否正确地实现或理解了这一点。据我所知,连续碰撞检测用于快速移动的物体,这些物体可能会绕过正常的碰撞检测而穿过另一个物体。
因此,我尝试的是,因为我唯一有的快速移动的物体是球,我只需要球的位置、移动速度和我们要比较的物体的位置。
从这个角度出发,我认为最好的做法是,例如,如果球的移动速度表明它正在向左移动,我将比较它的最左边界与其他物体的最右边界。从这里开始,我将通过将球的移动速度加到最左边界来进行步进,并进行比较,以确保它大于其他物体的右边界。这将表明没有左右碰撞。
我有一些东西基本能用,但不幸的是,球开始正常弹跳一段时间,然后就像撞到挡板一样,而实际上并没有任何东西。
我有点迷失了,任何帮助都将不胜感激!
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个回答

1

看起来你只在检查一个维度的碰撞,即在你的球和其他对象之间的 X 维度。

你可能想要比较这两个对象在 2D 空间中是否发生碰撞。这可以通过调整每个对象的边界矩形,并检查矩形是否重叠轻松完成。然后在循环中,你可以相应地调整你的球矩形。


哦,你说得对!我已经在这个项目上工作太久了,忘记了不检查 Y 维度的副作用。 - RedShft

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接