Пишу простой физдвижок и есть пара вопросов.
1. Какие подходы вы используете для этого дела? Есть какой-то отдельный класс-резолвер или каждый объект имеет внутри код, обрабатывающий это дело для него?
2. Два врага движутся по прямой в сторону игрока. В какой-то момент они сталкиваются и их спрайты сливаются в один. Я хочу, чтобы они продолжали двигаться бок о бок по новой траектории. Как это реализовать?
Robotex
> Есть какой-то отдельный класс-резолвер или каждый объект имеет внутри код,
> обрабатывающий это дело для него?
разрешение столкновений, равно как и других связей — принципиально нелокальная операция. это означает, что метод объекта идеологически не должен быть ответственен за разрешение таких взаимодействий. обычно для этого есть физическая система, которая знает о всех объектах и всех связях, которые она и разрешает.
Robotex
> 1. Какие подходы вы используете для этого дела? Есть какой-то отдельный
> класс-резолвер или каждый объект имеет внутри код, обрабатывающий это дело для
> него?
Использую Task based систему, например class GravitationTask обрабатывает игровые объекты на предмет воздействия на них гравитации.
Robotex
> 2. Два врага движутся по прямой в сторону игрока. В какой-то момент они
> сталкиваются и их спрайты сливаются в один. Я хочу, чтобы они продолжали
> двигаться бок о бок по новой траектории. Как это реализовать?
Здесь сначала collision detection, а потом уже DispatchCollisionTask который смотрит какие типы объектов столкнулись и какой Task создавать для обработки этой ситуации.
gamedevfor
> какой Task создавать для обработки этой ситуации
А как бы ты обработал эту ситуацию? Вопрос именно в этом. Два объекта столкнулись, мы это зафиксировали и должны поменять равномерное движение, указанное вектором скорости-направления на что-то более сложное. Но вот на что?
Развести объекты на расстояние суммы радиусов?
P.S. Я подумываю об EventQueue для обработки коллизий
Robotex
> 2. Два врага движутся по прямой в сторону игрока. В какой-то момент они
> сталкиваются и их спрайты сливаются в один. Я хочу, чтобы они продолжали
> двигаться бок о бок по новой траектории. Как это реализовать?
>
Обычно, физический движок (а не программист!!!) сам решает, как при коллизиях разлетаются объекты.
А то что ты хочешь (как я понял) - это не совсем физика коллизий а некий кинематический скрипт?
И в чём конкретная проблема? Если столкновение умеешь определять, как только оно произошло, обоим объектам задаешь взамен их
прежних, новый одинаковый (сонаправленный) вектор скорости. Они и полетят "бок о бок" в одном направлении.
Robotex
> Но вот на что?
Зависит от логики игры, от типов объектов которые столкнулись, может быть от столкновения один из объектов должен взорваться и второй объект отлетит с ускорением из-за воздействия на него ударной волны. В общем универсального ответа здесь нету и быть не может.
Robotex
> Я подумываю об EventQueue для обработки коллизий
В чем плюс такого подхода?
rcsim
> это не совсем физика коллизий а некий кинематический скрипт?
да там примитивизм: игрок в центре и враги летят на него по прямой со всех сторон. Нужно обрабатывать столкновение врагов (чтобы спрайты не накладывались), столкновение врага со снарядом (тоже по прямой летит) и врага с игроком
gamedevfor
> может быть от столкновения один из объектов должен взорваться
Ну, должна быть анимация уничтожения и освобождение объекта в пулле
gamedevfor
> В чем плюс такого подхода?
Чтобы физический движок мог коммуницировать с пуллом объектов. Ну и плюс управление тоже сюда привязать. Хотя можно и обсервером примитивным сделать
А тут же еще возможна ситуация, когда снаряд туннелирует сквозь врага :(
Robotex
Тоесть у тебя она только "возможна"? Ну окей... 1 проблему физдвижка из 1000 ты уже заметил.
lookid
> 1 проблему физдвижка из 1000 ты уже заметил
А как эта проблема фиксится?
Robotex
>туннелирует сквозь врага
Гугли continuous collision detection
Ок, движок может определять столкновение двух многоугольников. Теперь нужно применить к каждому объекту силу, чтобы они изменили свои траекторию и скорость. И как посчитать направление и величину сил для каждого объекта?
Объект представлен двумя координатами положения, вектором ориентации, массой, векторами скорости и результирующей силы, действующей на тело (используется для вычисления ускорения).
А как заставить объект ещё и правильно вращаться после удара?
Ну ок, допустим, через массу и скорость можно посчитать импульсы и найти новые скорости. Но ведь нужен еще и угол отражения. Т.е. придется найти точку касания. Какие есть подходы для этого?
https://gamedev.ru/community/gd_physcomm/articles/phys_engine_development
https://gamedev.ru/code/articles/?id=4706