Представление игровых объектов в виде конечных автоматов
Гарантия сохранения последовательности действий.
Пользователь Reddit под ником distinctdan опубликовал небольшой пример использования конечных автоматов для создания логики поведения игровых объектов. Мы выбрали из его рассказал главное.
Если вы не знакомы с конечными автоматами, но хотите получить начальные знания по этой теме, советуем прочитать этот текст.
По словам пользователя, недавно он закончил свою мобильную игру Orbus и решил поделиться техниками, которые применял в разработке. Использование конечных автоматов в игре даёт несколько преимуществ.
- Если организовать весь код в виде чётко прописанных состояний, то это может предотвратить множество ошибок.
- Это помогает спланировать все состояния, в которых может находиться игровой объект.
- Прописанные переходы между состояниями гарантируют, что объекты не попадут в странные или незапланированные состояния.
- Также это позволяет легко сериализовать игровые объекты.
Поведение шара можно определить как последовательность из трёх состояний: бездействие, прицеливание, атака. Чтобы следить за тем, как долго продолжается то или иное состояние, используются таймеры: cooldownTimer и stateTimer. Вот список правил:
- шар стреляет, если видит игрока, и если он перезарядился;
- во время прицеливания шар испускает слабый луч, который показывает, что скоро будет атака и игроку пора уворачиваться;
- атака наносит урон игроку.
Теперь нужно прописать переходы между состояниями. Когда шар входит в новое состояние, он определяет все свойства, необходимые для этого состояния. Можно использовать таймер, чтобы объект оставался в определённом состоянии в течение какого-то времени.
Все таймеры хранятся в виде чисел — это упрощает сохранение и восстановление текущего состояния лазера.
Если представить состояние в виде конечного автомата, то это гарантирует, что состояния всегда будут адекватно и последовательно переходить от одного к другому: бездействие — прицеливание — атака. Поэтому шар никогда не выстрелит, пока не прицелится.