viernes, 27 de febrero de 2015

Generar Movimiento: Que no aterricen!


Existen dos técnicas básicas para controlar movimiento de objetos. La primera (que ya vimos en el pasado) es por medio del manejo de cuadros (frames). Podemos alterar o manipular en tiempo de ejecución cuando ingresamos a un nuevo cuadro, cuando estamos dentro o al salir del mismo.







Otra forma muy básica y clásica es mover objetos en función del tiempo utilizando temporizadores (Timers).

Las funciones que maneja openfl para la manipulación de cuadros son: Event.ENTER_FRAME y Event.EXIT_FRAME

Desde el punto de vista del programador son iguales. La diferencia es que la carga de procesos en la primera va a estar al inicio de la renderización y la segunda al finalizar la misma.
En lo personal, no le veo mucho sentido a utilizar las dos en una sola rutina.

Event.ENTER_FRAME un poco más en profundidad:

Como ya sabemos, es un evento que llamará a una función al comienzo del proceso de dibujo (Render en inglés)  de un cuadro en un lapso de tiempo establecido por el programador.

Este lapso de tiempo, lo definimos al comienzo de un proyecto en las propiedades del mismo dentro del archivo project.xml

fps="60"

Esta constante definida por el programador, no asegura que la aplicación cuando se esté ejecutando, se mantenga . De hecho, los cuadros por segundo (FPS), están muy ligados a que el dispositivo sea capaz de mantener ese poder de proceso.

Cuanto más carga de dibujo tengamos en nuestra aplicación, más trabajo tendrá el dispositivo que la corra, además necesitará del uso de una mayor cantidad de memoria.

Si al trabajo que le toma al dispositivo dibujar cada cosa en la pantalla a un ritmo determinado (en este caso 60 fps), le sumamos tener que lidiar con la lógica (Llamémosle control de colisiones, contadores, flags, etc..) de nuestra aplicación, podemos encontrarnos en muchas ocasiones con que el rendimiento no es el esperado.

Pero dejemos este tipo de problemas para más adelante. Por el momento, tendremos que nuestro juego corre a una tasa de 60 fps y que en cada cuadro vamos a estar monitoreando algo:

  1. El movimiento de nuestra nave (derecha o izquierda).
  2. El disparo del misil que ejecuta nuestra nave.
  3. Si nuestro misil impacta a un enemigo.
  4. Si nos atacan (dibujo del misil enemigo) y su impacto con nuestra nave..
  5. Movimiento del plato volador superior y si es impactado.




Como se ve, el código es relativamente sencillo. Sólo quiero detenerme a explicar un poco el disparo de nuestra nave:

En el juego original de Space Invaders, estaba permitido un solo disparo hasta que se cumpla una de dos condiciones: o impacte contra un objeto o se haya errado y salga de pantalla.

Yo quise recrear las mismas condiciones aquí: Tengo dos variables que manejan este “efecto” y no permiten que el usuario pueda repetir un disparo hasta que no se hayan cumplido las condiciones mencionadas arriba.







Luego tenemos el segundo método de monitoreo que son los Temporizadores:

Un temporizador ejecutará el código contenido dentro de su función cada X unidades de tiempo (medidas en milisegundos).

Para utilizarlos, debemos importar las librerías:

import openfl.events.TimerEvent;
import openfl.utils.Timer;

Luego lo declaramos:

private var temporizador = new Timer (1000);

En este caso, tenemos que temporizador va a ejecutar su evento cada 1000 milisegundos (1 segundo).

temporizador.addEventListener (TimerEvent.TIMER, Tiempo);

Agregamos el evento y la función a la cual llama, por último lo iniciamos:

temporizador.start ();

Este evento estará encargado de varias cosas:

  1. Mover los aliens cada segundo que pasa (moverlos en forma horizontal).
  2. Mover los aliens cada 5 segundos (en forma vertical)
  3. Activar el plato volador cada 10 segundos
  4. Que un Alien (elegido en forma aleatoria) dispare contra nosotros.
  5. Si un objeto ha sido impactado, esconde la explosión.

Aquí hay tres contadores independientes que controlan la lógica. El código es muy lineal y creo que se entiende por sí solo.




Por una cuestión de mantener el código sin estructuras complicadas, decidí que si existe un impacto entre objetos, se muestre una explosión y al cabo de 1 segundo (mas o menos) la misma se oculte automáticamente. No es lo ideal, ya que vamos a ver que bajo ciertas condiciones la explosión se va a demorar un poco más o menos (deberíamos de usar otro timer para controlarla eficazmente).

Vamos llegando al fin de esta serie. Sólo nos queda agregar efectos de sonido y mensajes.

Descargar el fuente desde Aquí

No duden en contactarme si surgen dudas.