Итак, я пытаюсь сделать игру с использованием C ++, и я прочитал массу статей на Конечные автоматы (ФСМ), а также Иерархические конечные автоматы (HSM). Тем не менее, я признаю, что большинство прочитанных материалов немного плотное и трудное для понимания, поэтому я надеялся, что кто-то может упростить это для меня. Этот ответ — FSM или HSM?
Из того, что я хотел бы прояснить:
Чем HSM отличается от обычного FSM и почему он лучше для игр?
Что касается C ++, как вы реализуете базовый HSM, следуя шаблону состояния? (Я могу ошибаться в этом / использовать неправильные слова.)
Как именно вы обрабатываете переходы? О каких методах on_exit и on_enter я постоянно слышу?
Нужен ли мне один HSM для всей моей игры? (например, обработка всех врагов, действий игрока, игровых меню) или я использую несколько модулей HSM?
При реализации сущностей игроков все ли они будут подмножеством состояния сущности?
Наконец, если бы кто-то мог дать какой-то псевдокод, чтобы помочь визуализировать эти вопросы, я был бы признателен.
Это просто о вложенности. HSM — это, по сути, FSM, но каждый штат в свою очередь может быть отдельным FSM.
Для примера в игре рассмотрим NPC. Он имеет несколько состояний:
Этот FSM прост, но все состояния должны иметь переход в состояние 6 (Борьба с ПК), когда NPC подвергается атаке ПК. Это делает ФСМ уродливым. Так что вместо этого давайте этот Гораздо проще ФСМ:
Этот FSM очень прост, есть только два перехода, и это легко понять. Основные части штата 1 являются вторичными FSM:
Если есть событие, которое не соответствует вторичным переходам FSM, например, атака ПК, вы поднимаетесь на уровень к FSM верхнего уровня, чтобы соответствовать событию и находите подходящий переход.
В некотором смысле вы можете думать об этом как о стеке, каждое состояние на более высоком уровне может выдвинуть новый FSM более низкого уровня. Если есть четное число, которое не соответствует ни одному из возможных переходов, вытолкните стек и вернитесь на уровень выше. Продолжайте, пока не появится соответствующий переход.
Короче говоря, это способ упростить FSM.
Других решений пока нет …