2D Continuous 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;
    }
}
6
задан RedShft 9 March 2012 в 04:05
поделиться