Tutorial jME: 3. La dinamica de los videojuegos.

Bueno, despues de ese receso que tuvimos regesamos al tutorial de jME. En este punto estamos a punto de empezar a codificar nuestro videojuego, pero aun nos falta una cosa por saber: "como chirriones funcionan los videojuegos?" xD.

Veran, en los videojuegos mas simples se usa una estructura muy comun, se hace un bucle o ciclo infinito que solo se interrumpe cuando cerramos el juego, esto por que solo se permite ejecutar una operacion a la vez (si, ya se que se pueden ejecutar mas y que se pueden crear mas hilos y todo eso, pero no voy a poner cosas tan 'pro' en este tutorial, bueno, tal vez cuando vayamos mas avanzados xD).

Muevele al pacman, un ejemplo facilito
Tal vez esto no quede muy claro en un principio asi que lo explicare con un ejemplo de un juego sencillo como es el pacman (Apoyarse en la imagen para entender mejor, y si, tambien ya se que asi no son los diagramas pero me da pereza hacerlo como se debe xD).

Siguiendo el diagrama de arriba hacia abajo podemos ver que todo inicia moviendo a pacman, desdpues de mover a pacman movemos al fantasma (estamos siguiendo el sentido de las flechas), despues vemos si pacman esta a una distancia lo suficientemente corta como para que se coma los puntitos aquellos que come, pero aqui podemos ver que hay dos posibilidades: si se la puede comer (en este caso hacia abajo) y si no se la puede comer (en este caso a la izquierda), como podemos ver si no se la come se salta el paso de comer. Algo parecido ocurre cuando verificamos si el fantasma alcanzo a pacman, si no lo alcanzo entonces sigue el camino hacia la derecha llevandonos de nueva cuenta al punto de inicio (mover a pacman), pero si no lo alcanzo vemos que se ejecutan dos pasos mas (matar a pacman y regresarlo a la pocision de inicio, entindase la pocision donde salen al iniciar el juego), aqui el punto a marcar es que inevitablemente esta estructura nos esta llevando de regreso al punto donde iniciamos.



Muy facil pero no muy bueno.
Esta estructura es muy efectiva, nadamas que tiene un inconveniente, todos los calculos estan hechos a velocidad procesador de computadora (xD), que dicho en otras palabras podriamos decir "jodidamente rapido" lo que hace que nuestro juego sea imposible ademas de que la velocidad variara de computadora a computadora. En juegos muy simples (como el pacman o el tetris) esto se soluciona agregando un retraso (tambien conocido como sleep o delay), lo que se hace es detener la ejecucion por cierto tiempo, por ejemplo, en el diagrama anterior lo que se prodria haber hecho es detener el juego por unos 100 milisegundos (un milisegundo es la milesima parte de un segundo, por lo que 1000 milisegundos serian un segundo), al hacer esto la velocidad del juego ya se ve reducida (el ojo humano es capaz de ver alrededor de 12 imagenes por segundo, este es un valor que debemos tener en cuenta al crear retrasos como el que les comento).

Lo que vamos a usar
Si vamos a hacer un juego de los mas simples podemos usar una estructura como la que se explico aqui arribita sin problemas, pero en juegos mas avanzados se necesitan realizar tareas mas complejas, ademas de que no podemos esperar que todas las computadoras que corran el videojuego tengan la misma capacidad (aspecto que tambien influye en el desempeño de nuestro juego), pero por suerte el jME nos provee de 10 estructuras diferentes de las que podemos elegir la que mejor se adapte a nuestro videojuego. A continuacion les pongo la lista de estructuras que nos da el jME, la traduccion es hecha por mi, asi que no se sorprendan si la ven medio trucha.

AbstractGame AbstractGame define un metodo comun para implementar en el juego. De hecho no es una estructura, pero viene con ellas xD.
BaseGame BaseGame provee la implementacion mas simple del bucle/ciclo principal del juego, mas o menos como lo que les comente del pacman.
BaseHeadlessApp BaseHeadlessApp provee la implementacion mas simple del bucle/ciclo principal del juego para aplicaciones sin cabecera
BaseSimpleGame BaseSimpleGame provee la implementacion mas simple del bucle/ciclo principal, en este la interpolacion se hace entre cuadros para FPS (cuadros por segundo) variables.
FixedFramerateGame FixedFramerateGame intenta correr el juego a determinados FPS.
FixedLogicrateGame FixedLogicrateGame intenta hacer que la logica del juego corra a determinada velocidad.
SimpleGame SimpleGame provee la implementacion mas simple del bucle/ciclo principal del juego, mas o menos como lo que les comente del pacman. Esta estructura crea practicamente todo el ciclo por nosotros.
SimpleHeadlessApp SimpleHeadlessApp provee la implementacion mas simple del bucle/ciclo principal del juego, mas o menos como lo que les comente del pacman. Esta estructura crea practicamente todo el ciclo por nosotros pero para aplicaciones sin cabecera.
SimplePassGame SimpleGame La verda no se para que es este, si alguien me explica se le agradece xD.
VariableTimestepGame VariableTimestepGame provee una estructura muy simple y procesa todo lo mas rapido que puede, sin embargo para compesar los FPS tan variables el desplegado de imagenes se hace cada tanto tiempo. Este es mi favorito personal.

Ahora que conocemos mas o menos cual es la mecanica con la que funcionan los juegos procederemos a empezar con la codificacion de nuestro juego. Si no entendieron muy bien las estructuras que proporciona el jME no se preocupen, ya las explicare a detalle mas adelante (al menos la de VariableTimestepGame que es la que usaremos).

Supongo que ya se abran acostumbrado a que tarde en actualizar el blog, pero ahora lo hago oficial, intentare actalizar por lo menos 3 veces a la semana, asi no es tan agotador para mi y ustedes no tienen que esperar tanto xD.