viernes, 6 de marzo de 2015

Space Invaders: Final del Tutorial


Es curioso que la imagen a la izquierda pese más de la mitad (62Kb) que el proyecto - ejemplo terminado (104Kb).

En esta última entrega de Space Invaders, agregamos algo más de control y lógica, sonido y terminamos de construir el juego.

Agreguemos algún efecto de sonido para que no sea taaaan aburrido de jugar :P





Igual que para el ejemplo del Arkanoid, comenzamos con la declaración de las librerías que vamos a utilizar en Main.hx:

import openfl.media.Sound;
import openfl.Assets;

Luego creamos el directorio y le colocamos los sonidos dentro. (Si esta tarea la realizan con el sistema operativo, FlashDevelop los mostrará en su árbol del proyecto al tiempo en que refresque)





Agregamos en las opciones del proyecto (project.xml) el lugar donde apuntan los nuevos recursos

<assets path="assets/Audio" rename="audio" type="audio" />

Los declaramos en Main.hx:




y los asignamos a cada objeto declarado:




Por último, mediante el método  .play() los utilizamos en las diferentes secciones del código.

Quiero detenerme por un minuto en la rutina de impacto.



La lógica detrás de todo el código es muy sencilla, pero para que no queden dudas:

  1. Dentro del bulce (for..loop en línea 241), recorremos el array donde se encuentran alojados todos los objetos (marcianos).
  2. El primer condicional (if..else en la línea 245) chequea que el array no se encuentre con un valor nulo.
  3. El segundo condicional (línea 247) va mirando si el objeto dentro del array (que va incrementándose por el bucle (i) no ha sido impactado con el misil disparado.

    Si devuelve Verdadero (True)
   
  • Las coordenadas del alien impactado se las pasamos a la explosión. (249-250)
  • La mostramos (251).
  • Removemos al alien impactado de la escena (252).
  • y del Array (253). (En realidad no lo removemos, sino que creamos una copia del array reordenado sin el objeto removido.
  • Escondemos el misil que ha impactado (para que no siga subiendo) (254).
  • El flag “Disparo” toma como valor False (haciéndole saber a las demás rutinas que no existe otro disparo en escena (255).
  • Emitimos el sonido (256).
  • El flag de control pasa a verdadero, permitiendo otro disparo (257).

    La misma lógica se aplica para el Plato volador (264-274), pero más sencilla ya que es un solo objeto.

Por último; Hemos hecho que un alien (elegido aleatoriamente) nos dispare cada 4 segundos y debemos monitorear que si nos impacte el juego termine:

Parte del control, sucede en el evento de En_CadaCuadro (214-217) que va moviendo el misil alienígena por la pantalla.



Pero cada vez que se mueve, llamamos a una rutina para verificar el impacto:

Si el condicional (223.. If) devuelve falso, no pasa nada y el proceso sigue normalmente, pero si es verdadero…

Las líneas 225..230 se explican por sí solas pero luego tenemos que:

  • Detenemos el evento temporizador (timer)
  • Removemos todos los eventos que hasta ese momento se encontraban activos, por lo cual, el juego termina (quedando como en pausa).

Como con los demás ejemplos, la idea de estas series es mostrar de forma sencilla la aplicación de estas herramientas. Mi intención no es tener un juego totalmente funcional y libre de errores (cosa que pueden hacer ustedes)

Espero que las cosas que he explicado en este tutorial se hayan comprendido, no duden en contactarme si tienen problemas con el código.


La versión completa en GitHub