Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Статьи / Машина состояний

Машина состояний

Автор:

Представлю на суд общественности свою реализацию машины состояний, также известную как конечный автомат. Машина состояний привлекательна тем, что обрабатывает логику поведения объекта в заранее настроенном алгоритме, что крайне необходимо для сложных объектов. В статье приведу логику объекта, использующегося в моей игре Tropic Defense.

Tropic Defense скриншот | Машина состояний

Теория
Настройка сложного объекта

Теория

Машина состояний это сущность, состоящая из конечного набора состояний объекта с правилами перехода между этими состояний. Можно выделить три части конечного автомата:

  • Состояние объекта
  • Событие
  • Менеджер состояний.

    Состояние объекта (State): Если просто, то это то, что в текущий момент происходит с объектом. Ящик может лежать, катиться, падать. Это все состояния. Внесу новый термин – State, для описания программной реализации состояния. State должен знать как реагировать на разные события, это его первоочередная задача.

    Событие(Event): Для того же ящика события могут быть: толкнуть, столкнуться с землей, скатиться с опоры. События (Event) нужны для оповещения машины состояний, что с объектом что-то произошло. Если ящик лежит и его толкнули, то он покатиться.  Это переход из состояния «лежать» в «катиться» по событию «толчок».

    Менеджер состояний (Machine): На нем лежит вся логика обработки событий, перехода состояний, оповещение о изменении состояния объекта.

    Простая реализация может выглядеть следующим образом:

    + Показать

    Вывод:

    + Показать

    Первое событие будет обработано, но реакции на него не последует. Последующие два события успешно отработают, поменяв состояния у объекта. Код приведен простой с минимальным количеством проверок, сугубо в показательных целях. Это очень простой пример, имеется два состояния и два перехода между ними.

    Настройка сложного объекта

    Следующий пример будет гораздо сложнее, но таким же легким в управлении.  Приведу схему логики пушки для игры жанра Tower Defense:

    пушка | Машина состояний

    Всего 6 состояний:
    1.  Сон. Пушка ждет врага, в этот момент с ней ничего не происходит.
    2.  Подготовка к бою. К примеру поднятие орудий.
    3.  Подготовка ко сну. Обратное состояние к «подготовка к бою», опускаются орудия.
    4.  Режим огня. Расстреливает патроны по врагу.
    5.  Перезарядка, заряжаются орудия.
    6.  Ожидание следующей цели, включается когда враг убит.

    6 событий:
    1.  Обнаружена цель.
    2.  Орудия готовы.
    3.  Перезарядить орудия.
    4.  Цели нет.
    5.  Отдыхать.
    6.  Спать.

    8 переходов:
    1.  Сон-подготовка.
    2.  Подготовка-стрельба.
    3.  Стрельба-перезарядка.
    4.  Перезарядка-стрельба.
    5.  Стрельба-ожидание цели.
    6.  Ожидание цели-стрельба.
    7.  Ожидание-подготовка к отдыху.
    8.  Отдых.

    Настроив логику пушку согласно схеме, управление для нее сводиться к двум командам: «capture target» и «release target». Все остальное пушка сделает уже сама.

    Видео с пушкой и врагов:

    + Показать

    Исходный код: State Mashine Example
      Машины состояний: FiniteStateMachine.h, FiniteStateMachine.cpp
      Пример использования для вышеописанной пушки: MachineShoot.h, MachineShoot.cpp
      Код можно посмотреть, скачать, использовать по своему усмотрению.

    Проект Tropic Defense: http://www.gamedev.ru/projects/forum/?id=186106

  • 14 сентября 2014

    #конечный автомат, #логика, #машина состояний


    Обновление: 11 октября 2014

    2001—2017 © GameDev.ru — Разработка игр