Рассчитайте, если две частицы сблизятся
Я делаю простое обнаружение столкновений для 2D-игры в PSM Studio.
Мой текущий метод включает в себя итерацию по каждому игровому объекту и нахождение расстояния между другими игровыми объектами, а затем определение того, находятся ли эти два на определенном расстоянии (обычно 1/2 ширины каждого объединенного объекта). Если они есть, считается, что они столкнулись.
Хотя этот метод работает во многих случаях, он имеет существенный запасной вариант. Если объект движется со скоростью, такой, что движение на кадр превышает ширину потенциального сталкивающегося объекта (то есть быстро движущегося снаряда в направлении врага), объект по существу телепортируется поверх другого, и даже если бы они столкнулись, они не
Я думаю о создании метода, который тестирует две частицы на двух отрезках. Сегменты линии будут состоять из начальной конечной позиции каждого объекта во время обновлений.
Зная полярное движение (угол и величину) каждого объекта, а также их соответствующие отрезки, могу ли я рассчитать, находятся ли две частицы в пределах этого магического расстояния, что означает, что они столкнулись?
1 ответ
Я также столкнулся с этой проблемой, и мое решение состояло в том, чтобы обнаружить столкновение во время движения объектов.
Если бы расстояние, пройденное во время цикла, было больше, чем размер объекта, я бы разбил движение на несколько меньших движений и решил бы столкновения для каждого из этих разложений.
Пример:
Коробка движется быстрее, чем его собственный размер, поэтому обнаружение с красным цветом не будет обнаружено. Таким образом, движение разлагается на небольшие движения, и на каждом этапе вы проверяете столкновение с красной линией.
На третьем этапе обнаруживается столкновение.
Я не знаю, подойдет ли это решение для вашей структуры, но, по крайней мере, оно может принести вам новую идею.
РЕДАКТИРОВАТЬ:
Обратите внимание, что для того, чтобы столкновение было обнаружено, вы должны убедиться, что вы не оставили никаких пробелов в движении. Чтобы сделать этот процесс максимально быстрым и убедиться, что вся область проверена, вы должны разделить движение на доли размера объекта.
Например: на рисунке выше давайте представим положение объекта до того, как движение будет 0 единиц, а в конце 100 единиц.
Если размер объекта составляет 30 единиц, вам необходимо проверить следующие позиции:
0, 30, 60, 90, 100
В каждом году вы увеличиваете позицию на размер объекта, пока не достигнете своего пункта назначения.
Имейте в виду, что если вы работаете, скажем... 40 циклов в секунду, в приведенном примере объект будет двигаться со скоростью:
40 cicles x 100 units = 4000 units per second
Если каждая единица представляет собой пиксель, и вы используете разрешение 800x600, объект будет двигаться со скоростью более четырех экранов в секунду, что является огромной скоростью.
При этом я просто хочу отметить, что "Высокая скорость" довольно относительна, и если вы не работаете с действительно маленькими объектами, этот процесс не будет происходить так часто, как первоначально ожидалось.