Machine à états finis en C ++

16

J'ai donc lu beaucoup de choses sur l' utilisation des FSM pour faire la gestion de l'état du jeu, des choses comme ce qu'est un FSM et l'utilisation d'une pile ou d'un ensemble d'états pour en créer un. J'ai traversé tout ça. Mais je suis coincé à écrire une implémentation réelle et bien conçue d'un FSM à cet effet. Plus précisément, comment peut-on résoudre proprement le problème de la transition entre les États, (comment) un État devrait-il être en mesure d'utiliser des données provenant d'autres États, etc. Quelqu'un at-il des conseils sur la conception et l'écriture d'une implémentation en C ++, ou mieux encore, des exemples de code?

Électro
la source
balises modifiées sur la base de cette discussion dans meta: meta.gamedev.stackexchange.com/questions/103/…
lathomas64

Réponses:

12

J'ai écrit un FSM basé sur un chapitre de "Massively Multiplayer Game Development" édité par Thor Alexander. À l'intérieur se trouve un chapitre intitulé "Machines à états parallèles pour les personnages crédibles". Ceci est écrit en python, mais les concepts sont facilement traduisibles en C ++. Je recommande fortement de vérifier cela, même s'il s'agit d'états de personnage, pas d'états de jeu.

Ce que j'ai créé est ici: https://github.com/swganh/mmoserver/tree/master/src/ZoneServer/GameSystemManagers/State%20Manager regardez sous StateManager pour les détails d'implémentation, mais en gros vous avez différents «états de base» que vous pouvez utilisation. Ensuite, à partir de là, vous avez les états spécifiques vers lesquels vous passez en tant que personnage, donc chaque état est une classe. Vous vérifiez ensuite si vous pouvez passer d'un état à un autre, puis sur `` entrer '', vous effectuez votre changement, vous pouvez également facilement faire des choses comme mettre des événements après le passage à un état. Jusqu'à présent, j'ai trouvé que cela fonctionnait très bien pour le jeu.

Ce que j'ai mis en œuvre est ce que le livre appelle une machine à états parallèles, ce qui est essentiel pour que plusieurs fsm fonctionnent ensemble, dans ce cas, vous pouvez passer à un état, qui bloque tous les autres états (par exemple: CreatureState_Dead). Je ne vais pas trop entrer dans les détails car je ne pense pas que cela vous aiderait vraiment, mais si vous le souhaitez, je peux élaborer.

Kyle C
la source
1
On dirait que le code a été déplacé vers: github.com/swganh/mmoserver/tree/master/src/ZoneServer/…
DK_
Correction de l' URL: StateManager.cpp StateManager.h
Higor E.
8

La programmation de l'IA de jeu par exemple (http://www.ai-junkie.com/books/toc_pgaibe.html) a un exemple d'implémentation qui est assez simple et gère simplement les bases. Les transitions sont gérées dans un seul appel de méthode (d'abord Enter (), puis Execute () à chaque mise à jour, Exit () lors de la transition)> Je ne sais pas de quoi vous auriez besoin en plus de cela. J'implémenterais des transitions plus compliquées en tant qu'états qui sont juste conçus pour s'exécuter une fois et passer à l'état suivant dans l'ordre.

Je vais essayer et supposer que vous regardez les FSM pour l'IA, si c'est le cas, je vous recommande de jeter un œil aux arbres de comportement. AIGameDev a d'excellents articles à ce sujet.

michael.bartnett
la source
1
Cet exemple est également disponible sur son site: ai-junkie.com/architecture/state_driven/tut_state1.html
Zolomon
5

Si la magie du modèle C ++ et les temps de compilation potentiellement longs ne vous posent aucun problème et que vous avez déjà installé Boost pour travailler avec :

Boost dispose désormais d'une bibliothèque de méta-états efficace ( en termes de vitesse et de taille ) qui a l'avantage de vous permettre de définir la table de transition séparément des structures d'états : vous disposez d'un tableau qui décrit quand passer d'un état à un autre. . Il suffit de le lire pour comprendre ce qui se passe dans la machine d'état.

L'autre avantage est qu'il a été testé par plusieurs entreprises même dans des logiciels embarqués avec des logiciels performants (voir la mailing list boost pour plus de détails). Comme l'implémentation est déjà là, cela pourrait être un bon choix si vous avez besoin d'une implémentation de machine d'état générique qui fonctionne juste (tm).

Il prend également en charge les états orthogonaux (états parallèles) et d'autres fonctionnalités utiles basées sur UML.

Il fournit également plusieurs façons d'exprimer la table de transition, l' une étant expérimentale mais intéressante du côté de l'expressivité (bien que limitée par les performances actuelles du compilateur - dommage!)

Klaim
la source