Как обнаружить столкновения между быстро движущимися объектами

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

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

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

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

Вместо a.x используйте min(a.x, a.x - a.velocity_x) вместо a.x + a.width используйте max(a.x + a.width, a.x + a.width - a.velocity_x) и т.д.

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

Ответ 2

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