Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Modelo VII: Diagramas de estado

Iniciado por Güarmigue, 23 de Julio de 2007, 05:14:38 PM

« anterior - próximo »

Güarmigue

Perdón por la tardanza, pero estoy de campus :) en el blog está el post puntual porque lo programé, pero a mi no me sale en el planet...

Definición: Los diagramas de estados son grafos dirigidos cuyos nodos representan posibles estados de un autómata y cuyos arcos representan la posibilidad de pasar de un estado a otro. La posibilidad de usar esa transición suele venir indicada con una condición sobre la entrada o sobre las variables del autómata. Un diagrama de estado debe tener un estado inicial y al menos un estado de salida.

Jugabilidad: En resumidas cuentas un diagrama de estados es una representación gráfica para un autómata. Un autómata es un programa que pasa a un estado u otro en función de las variables de entrada y del estado anterior. No tiene que hacer nada, solo cambiar de estado cuando debe. Pero en diseño de videojuegos, podemos aprovechar este comportamiento para que cada estado simule una determinada situación, con lo que podemos emular comportamientos o movimientos o reacciones inteligentes.

Por ejemplo, en el tema de movimiento, si tenemos un juego en el que queremos que un enemigo patrulle una determinada zona, podemos usar un diagrama de estados para hacerlo. Creamos tantos nodos como vertices tenga el polígono que define la ruta a seguir por el patrullero, luego creamos al autómata que cambia de un estado al siguiente si y solo si el patrullero llegó al punto indicado en ese nodo y sino permanece en el nodo y manda al patrullero la orden de avanzar en la dirección del punto.



Pero, además de para esto, podemos usar los diagramas de estados para simular comportamientos o reacciones de los enemigos. En el mismo patrullero anterior podríamos definir otro diagrama de estados que indicara el estado de alerta. En condiciones normales el enemigo está en modo descanso, patrulla pero lleva haciéndolo meses y está horriblemente aburrido. Si oye algo o ve algo puede pasar a modo alerta, con lo que estará mucho más pendiente y tal vez se mueva más rápido o se quede quieto oteando. Si ve al jugador pasaría a modo ataque, y emprendería fuego a la vez que alerta a la base.



Técnicamente éste diagrama de estado no es correcto al no tener estado de salida, pero en nuestro caso el enemigo patrullaría indefinidamente hasta que cambiáramos de fase o de zona o resultara muerto en combate. Podríamos añadir el nodo "Muerto" al que se podría llegar desde todos los estados al recibir un evento de colisión con una bala, pero para no emborronar más el grafo no lo he puesto, tampoco está en los algoritmos de abajo ya que simplemente tendríamos que eliminar el objeto (estructura o lo que sea) patrullero en ese caso.

Esto mismo puede aplicarse a la base. En condiciones normales hay patrullas y ambiente distendido. Si alguien da la voz de alarma se doblan las patrullas y todos pasan a estado de alerta. Si alguien dispara, los soldados más cercanos acuden al lugar del tiroteo...

No sé si os recuerda a algo, pero éstos podrían ser, muy básicamente, los diagramas que rigen el comportamiento de los alemanes en Commandos I. (En el segundo iban a recoger los paquetes de tabaco y eran más suspicaces :P) No hace falta mucho más para emular reacciones o estados de ánimo. En el Vampire Bloolines, que estoy jugando ahora, en la primera misión tienes que conseguir unos explosivos de un traficante. Si llegas a un "acuerdo" con él no tiene porqué haber derramamiento de sangre. Pero en el momento en el que tratas de entrar por la fuerza, robar algo o dices algo sospechoso, todos se ponen en modo ataque y te fríen a tiros, (por suerte eres un vampiro y las balas poco menos que te resbalan) en algunos casos sin ningún tipo de intersección como "EH! tú ¿qué haces robándonos el radiocasete?" Simplemente comienzan a disparar y el jugador comprende rápidamente que esa acción lo ha delatado...

Dificultades técnicas: Bien, los diagramas son muy útiles, pero ¿Cómo los programo? Al hablar de grafos dirigidos, puede parecer que es una tarea difícil, pero nada más lejos. Para programar un diagrama de estados solo necesitamos una sentencia de condición switch.

Veamos el ejemplo del comportamiento del patrullero:

int estadoPatrullero1(int entrada){

switch(entrada){
case 0: //0 => sin rastro de enemigo ni pista a la vista
if(estadoActual() == ALERTA){
tiempoAlerta--;
if(tiempoAlerta == 0) cambiaEstadoPatrullero(CALMA);
}
if(estadoActual() == ATAQUE){
cambiaEstadoPatrullero(BUSQUEDA);
cambiaEstadoBase(ALERTA);
}
break;

case 1: //1 => pista localizada
if(estadoActual() == CALMA)cambiaEstadoPatrullero(ALERTA);
if(estadoActual() == ALERTA)cambiaEstadoPatrullero(BUSQUEDA);
break;

case 2: //2 => enemigo a la vista
if(estadoActual() == CALMA)cambiaEstadoPatrullero(ATAQUE);
if(estadoActual() == ALERTA)cambiaEstadoPatrullero(ATAQUE);
break;

}
}

int estadoPatrullero2(int estado){

switch(estado){
case CALMA:
if(recibePista()){
cambiaEstadoPatrullero(ALERTA);
cambiaEstadoBase(ALERTA);
}
if(enemigoALaVista()){
cambiaEstadoPatrullero(ATAQUE);
cambiaEstadoBase(ALERTA);
}
break;

case ALERTA:
if(recibePista())cambiaEstadoPatrullero(BUSQUEDA);
else if(enemigoALaVista()){
cambiaEstadoPatrullero(ATAQUE);
cambiaEstadoBase(ALERTA);
}else{
tiempoAlerta--;
if(tiempoAlerta == 0)cambiaEstadoPatrullero(CALMA);
}
break;

case ATAQUE:
if(!enemigoALaVista()){
cambiaEstadoPatrullero(BUSQUEDA);
if(!recibePista())cambiaEstadoPatrullero(ALERTA);
}
break;
}
}

He puesto dos posibles algoritmos que implementarían el estado del patrullero y sus avisos a base. En el primero recibimos como entrada de la función el resultado de procesar la información que puede ver el patrullero, en la segunda recibimos el estado actual y el algoritmo llama a las funciones que chequean lo que ve el patrullero. Son ejemplos bastante simples, pero espero que ayuden a hacerse una idea de por donde van los tiros. En el estado de Calma el patrullero ejecutaría el diagrama de patrulla, en el de alerta podría otear y tener un bonus en sus sentidos (ampliar el rango de visión como ocurría en comandos) o simplemente andar más rápido. En el estado de ataque el enemigo dispararía al jugador (que se encuentra a la vista forzosamente) y lo buscaría si intenta escapar. Si el soldado lleva un tiempo X en estado de Alerta y no ha vuelto a ver ninguna pista ni enemigo, vuelve a estado de Calma...

Esta misma utilidad se puede utilizar para juegos de estrategia en la que la computadora, en función de las estadísticas o el modo de juego de sus contrincantes se ponga en estado atacante o defensivo. También son muy utilizados en aventuras gráficas, donde según el estado de la aventura o las acciones que hayamos desempeñado, un mismo personaje nos hablará de unas cosas o de otras.

En definitiva, los diagramas de estado son una herramienta muy potente y muy utilizada en videojuegos. Para tener claro a la hora de implementar lo más cómodo es tener el diagrama dibujado y luego solo tenemos que hacer el switch e ir implementando las funciones que rigen el comportamiento en cada estado.
url=http://deadchannel.blogsome.com]Dead Channel[/url] - Blog de informática, juegos, tortugas y lo que me viene dando en gana ;P

RobiHm

Web : Indómita
Blog : MiBlog
Evobas : Evobas
Kobox : Kobox






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.