Разработка коллизий для мультиплеерной игры

Давно не было постов о моей игре "We are vikings", а тем временем я сделал свой игровой движок с поддержкой мультиплеера и потихоньку буду рассказывать о нем и результатах. Сам мультиплеер ещё в разработке, попробывать его надеюсь можно будет через месяц-другой.

Чтож, о коллизиях!

Ребята стоят в очереди за колбасой

Итак, как работают коллизии в моей игре:

1. Сервер каждый тик обходит QuadTree (такая структура данных основнная на дереве позиций и "хитбоксов" юнитов) и ищет пересечения у прямоугольников. Если пересечение есть - можно рассчитывать коллизию (её может и не быть, если хитбокс это сложная фигура). В нашем случае всё просто - прямоугольники пересеклись - нужно разрешать коллизию.

2. Разрешение коллизии: для каждый прямоугольник "выталкивает" другой в направлении от своего центра.

3. Далее ECS система, отвечающая за передвижение детектит, что есть компонент типа "Толкать объект", и перемещает его на новую позицию. Важно, что это отличная от перемещений юнитов система, так как если вы например захотите переработать коллизии - то вам нужно лишь заменить эту систему, не трогая соврешенно другую логику.

4. Далее система отвечающая за передачу информации клиенту видит, что компонент типа "Толкать объект" изменился в этом тике - и сериализует (запаковывает) его в байтовый пакет для передачи по сети.

5. И в финале клиент слушает и безукоризненно применяет эти изменения в своей локальной системе, которая отвечает за позиции юнитов.

6. Система рендеринга считывает что в этот кадр позиция юнита поменялась - и перерисовывает его на экране в новом месте!

На этом все, а следить за релизами можно тут:

Ну и небольшой бонус:

похоже на отдельную игру, но нет, просто тест коллизий)
2
1
8 комментариев