Как обнаружить столкновения между быстро движущимися объектами
Как правило, для обнаружения столкновений в играх с холстом я использую что-то вроде:
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
Вы должны использовать всю область, перемещенную (в интервале обновления) движущимся объектом в качестве ограничивающего прямоугольника, чтобы проверить препятствие.