Какие принципы используются для Иерархического конечного автомата и как реализовать базовую модель? - PullRequest
0 голосов
/ 04 мая 2018

Итак, я пытаюсь создать игру на C ++, и я прочитал тонну статей о машинах конечных состояний (FSM) и машинах с иерархическим состоянием (HSM) . Тем не менее, я признаю, что большинство прочитанных материалов немного плотное и трудное для понимания, поэтому я надеялся, что кто-то может упростить это для меня. Является ли этот ответ FSM или HSM?

Из того, что я хотел бы прояснить:

  1. Чем HSM отличается от обычного FSM и почему он лучше для игр?

  2. Что касается C ++, как реализовать базовый HSM, следуя шаблону состояния? (Я могу ошибаться в этом / использовать неправильные слова.)

  3. Как именно вы обрабатываете переходы? О каких методах on_exit и on_enter я часто слышу?

  4. Нужен ли мне один HSM для всей моей игры? (например, обработка всех врагов, действий игрока, игровых меню) или я использую несколько модулей HSM?

  5. При реализации сущностей игроков все они будут подмножеством состояния сущности?

  6. Наконец, если кто-то может дать псевдокод, чтобы помочь визуализировать эти вопросы, я был бы признателен.

1 Ответ

0 голосов
/ 05 мая 2018

Речь идет о вложенности. HSM - это, по сути, FSM, но каждый штат в свою очередь может быть отдельным FSM.

Для примера в игре рассмотрим NPC. Имеет несколько состояний:

  1. Пройдите к точке A
  2. Подожди минуту
  3. Прогулка до точки B
  4. Подожди минуту
  5. Продолжить с 1
  6. Борьба с ПК

Этот FSM прост, но все состояния должны иметь переход в состояние 6 (Борьба с ПК), когда NPC атакован ПК. Это делает ФСМ уродливым. Итак, вместо этого давайте это гораздо более простой FSM:

  1. Ходить по
  2. Борьба с ПК

Этот FSM очень прост, есть только два перехода, и его легко понять. Основные части штата 1 являются вторичными FSM:

  1. Пройдите к точке A
  2. Подождите минутку
  3. Прогулка до точки B
  4. Подожди минутку

Если есть событие, которое не соответствует вторичным переходам FSM, например, атакующий ПК, вы поднимаетесь на уровень к FSM верхнего уровня, чтобы сопоставить событие, и находите подходящий переход.

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

Короче говоря, это способ упростить FSM.

...