Я пытаюсь реализовать простое непрерывное обнаружение столкновений для своей игры в понг, однако я не уверен, что реализую или понимаю это правильно. Непрерывное обнаружение столкновений 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;
}
}