Разработка коллизий для мультиплеерной игры
Привет, пикабу! Давно не было постов о моей игре "We are vikings", а тем временем я сделал свой игровой движок с поддержкой мультиплеера и потихоньку буду рассказывать о нем и результатах. Сам мультиплеер ещё в разработке, попробывать его надеюсь можно будет через месяц-другой.
Чтож, о коллизиях!
(стоят в очереди за колбасой)
Итак, как работают коллизии в моей игре:
1. Сервер каждый тик обходит QuadTree (такая структура данных основнная на дереве позиций и "хитбоксов" юнитов) и ищет пересечения у прямоугольников. Если пересечение есть - можно рассчитывать коллизию (её может и не быть, если хитбокс это сложная фигура). В нашем случае всё просто - прямоугольники пересеклись - нужно разрешать коллизию.
2. Разрешение коллизии: для каждый прямоугольник "выталкивает" другой в направлении от своего центра.
3. Далее ECS система, отвечающая за передвижение детектит, что есть компонент типа "Толкать объект", и перемещает его на новую позицию. Важно, что это отличная от перемещений юнитов система, так как если вы например захотите переработать коллизии - то вам нужно лишь заменить эту систему, не трогая соврешенно другую логику.
4. Далее система отвечающая за передачу информации клиенту видит, что компонент типа "Толкать объект" изменился в этом тике - и сериализует (запаковывает) его в байтовый пакет для передачи по сети.
5. И в финале клиент слушает и безукоризненно применяет эти изменения в своей локальной системе, которая отвечает за позиции юнитов.
6. Система рендеринга считывает что в этот кадр позиция юнита поменялась - и перерисовывает его на экране в новом месте!
На этом все, а следить за релизами мой Hearthstone-like игры можно тут:
Ну и небольшой бонус из ранней разработки коллизий)