Gestión de estados de juego

titulo-statemanager.png

Sion Tower cuenta con varios estados y transiciones los cuales están especificados en el Documento de Diseño (GDD) que publiqué hace tiempo. Por supuesto, me refiero a estados como “Juego”, “Menú”, “Selección de nivel”. Me parece interesante comentar a vista de pájaro estos estados así como el sistema subyacente que los gestiona. Puede ser una buena manera para saber hasta dónde pretende llegar el juego. En este artículo hablaremos de las clases State y StateManager entre otras.

Diagrama de estados

En el siguiente diagrama se muestran los distintos estados en los que se puede encontrar Sion Tower:

flowchart.png

Para detalles adicionales podéis acudir al documento de diseño que incluye bocetos completos de cada uno de los estados.

Diagrama de clases

A continuación podéis ver un diagrama UML con las clases que gestionan los estados del juego. Es bastante grande así que lo mejor es hacer click sobre la imagen para ampliarla.

statemanager.png

La clase State

State es una clase abstracta que modela un estado de juego genérico. Cuenta con los métodos virtuales load y clear para cargar y liberar los elementos que contiene sin necesidad de destruir el estado completamente. Todos los estados poseen un método update que recibe el tiempo en ms desde el último frame (deltaT) para actualizar lógicamente los elementos de dicho estado. Los estados están preparados para recibir los eventos que captura el StateManager, por ello cuenta con los manejadores típicos de la biblioteca OIS (más sobre OIS en IberOgre).

Por cada estado de juego tendríamos una clase que herede de State como podrían ser StateGame, StateMenu o StateCredits. Por ejemplo, el estado de juego controlaría al personaje, los enemigos y el escenario. Como podéis ver es un sistema muy genérico y extensible para otros proyectos. De hecho estoy pensando en liberarlo de forma independiente.

menu-principal.png

La clase StateManager

La clase StateManager lleva internamente una pila de estados lo que nos permite volver atrás por los menús del juego de forma muy sencilla. El tope de la pila sería el estado activo mientras que el resto pueden estar en pausa o ejecutándose en segundo plano. A través de los metodos changeState, pushState, popState y popAllStates se nos permite gestionar los cambios entre estados. No hay que tener cuidado con el momento en el que se hace un popState, no se destruye ningún estado en ese preciso instante. El StateManager espera a un momento seguro para hacerlo, no más segmentos violados en ese aspecto.

statestack.png

StateManager inicia el bucle de juego con el método start y se comporta como un FrameListener. En cada iteración se disparan los eventos frameStarted, frameEnded y frameRenderingQueued para actualizar lógicamente los estados activos de la pila. Así mismo recibe eventos de ventana, de teclado y de ratón que transmite a los eventos que controla.

La idea de la pila de estados y las transiciones seguras la tomé de uno de los proyectos de mi compañero José Tomás Tocino. Lo utilizaba en un juego con Gosu mientras que yo lo he adaptado a Ogre y OIS.

Conclusiones

Con esto terminamos la documentación de la gestión de estados de Sion Tower. Habréis comprobado que de una forma sencilla y ordenada podemos añadir, modificar y manejar nuestros estados de juego. Sed libres (GPL 3) de reutilizar este código alojado en la forja de Red Iris.

¡Se aceptan sugerencias, críticas y lanzamiento de fruta podrida!

comments powered by Disqus