Máquina de estado finito (FSM) Cocos2d-x para el desarrollo de juegos

En primer lugar, básicamente todo el software es una máquina de estados finitos (FSM). Es un gráfico dirigido que consta de un conjunto de nodos y un conjunto de funciones de transferencia correspondientes. En términos sencillos, es un modelo de un sistema impulsado por eventos.Este modelo consta de un número limitado de estados, una serie de entradas y reglas para la transición entre estados. En un momento determinado, uno o un grupo de estados es el estado actual del FSM El FSM recibe eventos de entrada y convierte el estado actual a un nuevo estado de acuerdo con las reglas de conversión. Precisamente por la combinación de estos tres elementos, la FSM tiene sus propias características de comportamiento. En el desarrollo de juegos, FSM se utiliza para implementar el proceso de toma de decisiones de la inteligencia artificial y controlar el comportamiento de los objetos del juego.

1. La máquina de estados más simple

Quizás la explicación anterior sea aún algo abstracta. La mayoría de los artículos usarán ejemplos de "puerta" o "cerradura" para ilustrar qué es una máquina de estado. Me gustaría dar un ejemplo nuevo: hay un NPC llamado "mono" , Caminará en el área designada, a veces se quedará, cuando camina hacia el límite del área, girará solo (Figura 1). Enumeramos las funciones de la regla de conversión de la máquina de estado en una tabla (Figura 2) y escribimos la implementación de C ++ de esta máquina de estado simple de acuerdo con las reglas enumeradas:

#ifndef MONKEY_H_
#define MONKEY_H_

#incluir

#include "cocos2d.h"

USING_NS_CC;

#define MAX_STOP_TIME 10
#define MAX_WALK_TIME 20

#define MAX_WALK_DIST 100

enum MonkeyState
{ STSTOP, stWALK, stTURN };



clase Mono
: público Nodo
{ público: Mono () { log (“Mono ()”); }




CREATE_FUNC (Mono);

virtual bool init ()
{ _curPos = 0; _step = 1;

changeState (stSTOP);

this-> scheduleUpdate ();

devuelve verdadero;
}

vacío changeState (MonkeyState newState)
{ _curState = newState; _curTime = tiempo (0); }


void stop ()
{ cocos2d :: log (“stop ()”); }

paseo vacío ()
{ _curPos + = _step; cocos2d :: log ("caminar (): pos =% d", _curPos); }


turno vacío ()
{ _paso * = -1; cocos2d :: log (“turn (): step =% d”, _step); }


void update (float dt)
{ switch (_curState) { case stSTOP: if (isStopTimeout ()) { changeState (stWALK); caminar(); } romper;






caso stWALK:
caminar ();

if (isWalkOutBorder ()) { changeState (stTURN); giro(); } else if (isWalkTimeout ()) { changeState (stSTOP); detener(); } romper;






case stTURN:
changeState (stWALK);
caminar();
descanso;
}
}

privado:
MonkeyState _curState;

time_t _curTime;

int _curPos;
int _step;

public:
bool isStopTimeout ()
{ return (tiempo (0) - _curTime> MAX_STOP_TIME); }

bool isWalkTimeout ()
{ return (tiempo (0) - _curTime> MAX_WALK_TIME); }

bool isWalkOutBorder ()
{ return (_curPos> MAX_WALK_DIST || _curPos <-MAX_WALK_DIST); } };


#endif // MONO_H_

 

2. El olor a código incorrecto

Obviamente, si continúa escribiendo el código anterior por completo, definitivamente funcionará bien. Pero parece que he olido el legendario "código incorrecto". La larga declaración de juicio condicional anterior se hará más larga a medida que aumenta el estado. Cada vez que se agrega un estado, debe buscarse y modificarse cuidadosamente en la declaración de juicio condicional larga. Cuando tales declaraciones condicionales crezcan y requieran que varias personas cooperen para completarlas, causarán serios problemas de mantenimiento y depuración. Además, para un lenguaje compilado, un FSM con N estados necesita hacer juicios N / 2 en promedio para encontrar un estado correcto.

En la máquina de estado anterior, este objeto en realidad muestra diferentes características de comportamiento en diferentes estados, y básicamente no hay conexión entre las diferentes características de comportamiento excepto para interfaces formales similares. Entonces, naturalmente, pensamos en el modo de estado, usamos el modo de estado para mantener el estado y nos damos cuenta de la separación del objeto y el estado de mantenimiento.

Supongo que te gusta

Origin blog.csdn.net/qq_21743659/article/details/108637535
Recomendado
Clasificación