Кінцевий стан машини в C ++


16

Отже, я багато читав про використання FSM для управління станом ігор, такі речі, як, що таке FSM, та використання стека або набору станів для його побудови. Я пережив усе це. Але я застряг у написанні реальної, продуманої реалізації FSM для цієї мети. Зокрема, як можна чітко вирішити проблему переходу між станами, (як), чи повинна держава використовувати дані з інших станів тощо. Хтось має поради щодо розробки та написання реалізації на C ++, а ще краще, приклади коду?


редагував теги на основі цієї дискусії в мета: meta.gamedev.stackexchange.com/questions/103/…
lathomas64

Відповіді:


12

Я написав FSM на основі розділу в "Масивно розробленому багатокористувацькому грі" під редакцією Тор Олександра. Всередині - глава з написом "Паралельні стани для правдоподібних персонажів". Це написано в python, але поняття легко перекладаються на C ++. Я настійно рекомендую перевірити це, хоча це стосується станів символів, а не станів гри.

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

Те, що я реалізував, - це те, що книга називає машину паралельного стану, що є суттєвою роботою декількох функцій fsm. У цьому випадку ви можете перейти в один стан, який блокує всі інші стани (тобто: CreatureState_Dead). Я не збираюся надто детально розбиратися в деталях, як я не думаю, що це вам справді допоможе, але якщо ви хочете, я можу детальніше розглянути.


1
Схоже, що код переміщено до: github.com/swganh/mmoserver/tree/master/src/ZoneServer/…
DK_

Виправлена ​​URL: StateManager.cpp StateManager.h
Вища Е.

8

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

Я візьму удар, і я припускаю, що ви дивитесь на FSM для AI, якщо так, я рекомендую вам поглянути на дерева поведінки. У AIGameDev є кілька чудових статей про це.


1
Цей приклад доступний і на його сайті: ai-junkie.com/architecture/state_driven/tut_state1.html
Zolomon

5

Якщо магія шаблону C ++ і потенційні довгі часи компіляції для вас не є проблемою, і ви вже встановили Boost для роботи :

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

Інша перевага полягає в тому, що його перевірили кілька підприємств навіть у вбудованому програмному забезпеченні з високоефективним програмним забезпеченням (детальніше див. Список розсилки розсилки). Оскільки реалізація вже є, це може бути хорошим вибором, якщо вам потрібна загальна реалізація державної машини, яка просто працює (tm).

Він також підтримує ортогональні стани (паралельні стани) та інші корисні функції на основі UML.

Він також пропонує декілька способів виразити таблицю переходу, один з яких експериментальний, але цікавий з боку експресивності (хоча обмежений поточною продуктивністю компілятора - занадто погано!)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.