2013-05-09 1 views
10

Обычно для обнаружения столкновений в брезентовых играх я использую что-то вроде:Как обнаружить столкновения между быстро двигающимися объектами

function collides(a, b) { 
    return a.x < b.x + b.width && 
    a.x + a.width > b.x && 
    a.y < b.y + b.height && 
    a.y + a.height > b.y; 
} 

Но это только обнаруживает столкновения, если объекты соприкасаются в то время, кадр обрабатывается. Если у меня есть спрайт, скорость которого (в пикселях/раме) больше ширины препятствия на его пути, он пройдет через препятствие без обнаружения столкновения.

Как я могу проверить, что находится между спрайтом и его пунктом назначения?

+1

На каждом кадре проверьте, пересекается ли вектор с длиной спрайта с объектом. –

+2

Возможно, вы захотите рассмотреть вопрос об этом на [GameDev.SE]. – zzzzBov

+0

Связано также: http://stackoverflow.com/questions/7364884/problem-with-collision-detection-of-a-fast-moving-ball-with-a-racket-controlled – JayC

ответ

2

Это, как правило, сложная проблема, и для высококачественного решения полезно использовать библиотеку Box 2D.

Быстрое и грязное решение (которое дает ложные срабатывания на диагонально движущихся объектах) - проверьте столкновение между ограничивающими прямоугольниками, которые закрывают положение объекта в токе и предыдущие рама.

Вместо использования a.xmin(a.x, a.x - a.velocity_x), вместо использования a.x + a.widthmax(a.x + a.width, a.x + a.width - a.velocity_x) и т.д.

Если объект, который движется быстро мала (пуля), то тест столкновение между линией (от ее происхождения до происхождения + скорости) и ящики других объектов.

0

Вы должны использовать всю область, перемещенную (в интервале обновления) движущимся объектом в качестве ограничивающего прямоугольника для проверки на препятствие.