Конечный автомат в C ++

16

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

электро
источник
отредактированные теги, основанные на этом обсуждении, в meta: meta.gamedev.stackexchange.com/questions/103/…
lathomas64

Ответы:

12

Я написал FSM на основе главы «Разработка многопользовательских игр» под редакцией Тора Александра. Внутри находится глава с надписью «Параллельные машины для правдоподобных персонажей». Это написано на python, но концепции легко переводятся на C ++. Я настоятельно рекомендую проверить это, хотя это касается состояний персонажей, а не состояний игры.

То, что я создал, находится здесь: https://github.com/swganh/mmoserver/tree/master/src/ZoneServer/GameSystemManagers/State%20Manager. Подробные сведения о реализации вы найдете в StateManager, но в основном у вас есть разные «базовые состояния», которые вы можете использовать. использовать. Затем оттуда у вас есть конкретные состояния, в которые вы переходите как символ, поэтому каждое состояние является классом. Затем вы проверяете, можете ли вы переходить из одного состояния в другое, а затем, нажимая клавишу «enter», вы можете легко сделать такие вещи, как вставка событий после перехода в состояние. Я обнаружил, что до сих пор это отлично сработало для игры.

Я реализовал то, что книга называет параллельным конечным автоматом, который необходим для совместной работы нескольких fsm, в этом случае вы можете перейти в одно состояние, которое блокирует все остальные состояния (например, CreatureState_Dead). Я не буду вдаваться в подробности, так как не думаю, что это действительно поможет вам, но если вы хотите, я могу уточнить.

Кайл С
источник
1
Похоже, код перенесен в: github.com/swganh/mmoserver/tree/master/src/ZoneServer/…
DK_
Фиксированный URL: StateManager.cpp StateManager.h
E.
8

Программирование AI на примере игры (http://www.ai-junkie.com/books/toc_pgaibe.html) имеет пример реализации, который довольно прост и просто обрабатывает основы. Переходы обрабатываются одним вызовом метода (сначала Enter (), затем Execute () при каждом обновлении, Exit () при переходе)> Я не знаю, что вам нужно, кроме этого. Я бы реализовал более сложные переходы как свои собственные состояния, которые просто предназначены для выполнения один раз и перехода к следующему состоянию по порядку.

Я сделаю удар и предположу, что вы смотрите на ФСМ для ИИ, если да, то я рекомендую вам взглянуть на деревья поведения. У AIGameDev есть несколько замечательных статей.

michael.bartnett
источник
1
Этот пример доступен на своем сайте , а также: ai-junkie.com/architecture/state_driven/tut_state1.html
Zolomon
5

Если волшебство шаблона C ++ и потенциальное долгое время компиляции не является проблемой для вас, и у вас уже есть установленный Boost для работы с :

Boost теперь имеет эффективную ( по скорости и размеру ) библиотеку мета-состояний, которая позволяет вам устанавливать таблицу переходов отдельно от структур состояний : у вас есть таблица, которая описывает, когда переходить из какого состояния в другое состояние , Вы просто должны прочитать его, чтобы понять, что происходит в государственной машине.

Другое преимущество заключается в том, что он был протестирован несколькими предприятиями даже на встроенных программах с высокопроизводительным программным обеспечением (подробности см. В расширенном списке рассылки). Поскольку реализация уже существует, это может быть хорошим выбором, если вам нужна универсальная реализация конечного автомата Just Works (tm).

Он также поддерживает ортогональные состояния (параллельные состояния) и другие полезные функции на основе UML.

Он также предоставляет несколько способов выражения таблицы переходов, один из которых является экспериментальным, но интересным с точки зрения выразительности (хотя и ограничен текущей производительностью компилятора - слишком плохо!)

Klaim
источник