Máquina de estados finitos en C ++

16

Entonces, he leído mucho sobre el uso de FSM para administrar el estado del juego, cosas como lo que es un FSM y el uso de una pila o conjunto de estados para construir uno. He pasado por todo eso. Pero estoy atascado en escribir una implementación real y bien diseñada de un FSM para ese propósito. Específicamente, cómo se resuelve limpiamente el problema de la transición entre estados, (cómo) debe un estado poder usar datos de otros estados, y así sucesivamente. ¿Alguien tiene algún consejo para diseñar y escribir una implementación en C ++, o mejor aún, ejemplos de código?

Electro
fuente
etiquetas editadas basadas en esta discusión en meta: meta.gamedev.stackexchange.com/questions/103/…
lathomas64

Respuestas:

12

Escribí un FSM basado en un capítulo en "Desarrollo de juegos multijugador masivo" Editado por Thor Alexander. Dentro hay un capítulo titulado "Máquinas de estado paralelo para personajes creíbles". Esto está escrito en python, pero los conceptos son fácilmente traducibles a C ++. Recomiendo comprobar esto, aunque se trata de estados de personajes, no de estados de juego.

Lo que creé está aquí: https://github.com/swganh/mmoserver/tree/master/src/ZoneServer/GameSystemManagers/State%20Manager busque en StateManager los detalles de implementación, pero básicamente tiene diferentes 'estados base' que puede utilizar. Luego, a partir de ahí, tiene los estados específicos a los que hace la transición como personaje, por lo que cada estado es una clase. Luego verifica si puede pasar de un estado a otro y luego, al 'ingresar', realiza el cambio, también puede hacer fácilmente cosas como poner eventos después de pasar a un estado. Descubrí que esto funcionó muy bien para el juego hasta ahora.

Lo que he implementado es lo que el libro llama una máquina de estado paralela, que es esencial para que múltiples fsm trabajen juntas, en este caso puede hacer la transición a un estado, que bloquea todos los demás estados (es decir: CreatureState_Dead). No voy a entrar mucho más en detalles ya que no creo que realmente te ayude, pero si quieres puedo dar más detalles.

Kyle C
fuente
1
Parece que el código se movió a: github.com/swganh/mmoserver/tree/master/src/ZoneServer/…
DK_
URL fija: StateManager.cpp StateManager.h
Higor E.
8

Programando la IA del juego por ejemplo (http://www.ai-junkie.com/books/toc_pgaibe.html) tiene una implementación de ejemplo que es bastante sencilla y solo maneja los conceptos básicos. Las transiciones se manejan en una sola llamada de método (primero Enter (), luego Execute () cada actualización, Exit () al hacer la transición)> No sé qué necesitarías además de eso. Implementaría transiciones más complicadas como estados propios que están diseñados para ejecutarse una vez y pasar al siguiente estado en secuencia.

Tomaré una puñalada y supondré que estás buscando FSM para IA, si es así, te recomiendo que eches un vistazo a los árboles de comportamiento. AIGameDev tiene algunos artículos geniales al respecto.

michael.bartnett
fuente
1
Ese ejemplo también está disponible en su sitio: ai-junkie.com/architecture/state_driven/tut_state1.html
Zolomon
5

Si la magia de la plantilla C ++ y los largos tiempos de compilación potenciales no son un problema para usted y ya tiene instalado Boost para trabajar con :

Boost ahora tiene una biblioteca eficiente ( en velocidad y tamaño ) de meta-máquina-estado que tiene la ventaja de permitirle configurar la tabla de transición por separado de las estructuras de estados : tiene una tabla que describe cuándo pasar de qué estado a otro estado . Solo tiene que leerlo para comprender lo que está sucediendo en la máquina de estado.

La otra ventaja es que varias empresas lo han probado incluso en softwares integrados con software de alto rendimiento (consulte la lista de correo de impulso para obtener más detalles). Como la implementación ya está allí, podría ser una buena opción si necesita una implementación genérica de máquina de estado que simplemente funcione (tm).

También admite estados ortogonales (estados paralelos) y otras funciones útiles basadas en UML.

También proporciona varias formas de expresar la tabla de transición, una de ellas es experimental pero interesante en el lado de la expresividad (aunque limitada por el rendimiento actual del compilador, ¡muy malo!)

Klaim
fuente