Saltar al contenido →

¿Cómo hacer un juego Shoo’Em Up con Quintus? – Parte 3

En esta tercera parte, voy a integrar sonidos, música ambiente, animaciones y una interfaz de usuario.

Corrigiendo más bugs…

De nuevo, revisando la segunda parte, me di cuenta que las naves enemigas seguían chocando unas con otras, y este comportamiento no es el que quería implementar. En la segunda parte de esta serie de artículos, expliqué cómo utilizando la propiedad «skipCollide» las colisiones serían detectadas pero no serían tratadas, pero no es así. Las colisiones eran detectadas y sí eran tratadas. Las naves al colisionar no avanzaban más, pero no se paraban sino que adecuaban su velocidad a la nave que iba delante. Esto no era el comportamiento que yo pretendía implementar, lo que yo quiero es que las naves enemigas se ignoren mutuamente y sigan adelante adelantándose unas a otras si fuera necesario. Para eso, la propiedad correcta es la misma que he utilizado para el objeto «Bullet», es «sensor: true».

Sonidos y música

Lo primero que voy a añadir es el sonido y la música ambiente. Para eso, necesito añadir una nueva dependencia, el módulo «Audio». Este módulo activa el soporte Web Audio o el soporte para HTML5 Audio dependiendo del navegador en el que se ejecute el juego. He creado con Bfxr algunos efectos de sonido que utilizaré en mi juego, los he convertido a ogg, mp3 y wav para poder soportar un número amplio de navegadores. La música ambiente es obra de Isak Martinsson.
Lo más interesante de este añadido es la forma de reproducir el efecto de sonido de la explosión de una nave enemiga o la del propio jugador. En los objetos «Enemy» y «Player», he añadido el código para escuchar el evento «destroy» que es lanzado cuando estos objetos son destruidos. En el método «destroyed» reproduzco el sonido deseado.

Animaciones

Quizás no puedan llamarse animaciones pero estas dos imágenes para el objeto «Enemy» y otras dos para el objeto «Player», me han permitido probar el módulo de animaciones de Quintus, el módulo «Anim». En la definición de las animaciones, presta especial atención a la definición del «trigger». Yo pensaba de manera equivocada que lo que se definía en «trigger», era una función a la que había que llamar una vez ejecutada la animación pero no, se refiere al evento lanzado después de ejecutar la animación. Lo que hay que hacer entonces es escuchar ese evento y definir un callback que se va a ejecutar cada vez que se escuche este evento. Utilizando este «trigger», podré sacar provecho para contabilizar el número de naves enemigas destruidas por el jugador.

Q.State o propiedades globales al juego

Quintus permite almacenar propiedades globales a tu juego que serán accesibles desde cualquier parte de forma sencilla. Estas propiedades son destinadas a almacenar cosas tan comunes como la puntuación, las vidas restantes, … En el caso de mi juego, utilizaré «State» para almacenar cuatro propiedades:

  • «enemimes_destroyed»: Contiene el número de naves enemigas destruidas por disparos del jugador.
  • «enemies_missed»: Contiene el número de naves enemigas que han desaparecido debajo del jugador.
  • «enemies_alive»: Contiene el número de naves enemigas que todavía están vivas.
  • «total_enemies»: Contiene el número total de naves enemigas.

Interfaz de usuario

Finalmente, he creado una sencilla interfaz de usuario para que el jugador pueda ver cuantos enemigos siguen vivos y pendientes de aparecer, cuantos ha destruido con sus disparos y cuantos han desaparecido por debajo de él. Mi interfaz de usuario consta de un simple contenedor con tres labels:

  • El primer label contendrá las naves enemigas destruidas por el jugador.
  • El segundo label contendrá las naves enemigas que han desaparecido (y muerto) saliendo del canvas por debajo del jugador.
  • El tercer label contendrá las naves enemigas que quedan todavía por destruir.

Me parece que en los comentarios del código del archivo quintus_ui.js hay una errata, pues en la definición del objeto «Container», se dice que las propiedades «x» e «y» se refieren a las coordenadas de la esquina superior izquierda del contenedor. Por lo que he podido probar, estas propiedades se refieren al centro del contenedor y no a esa posición. Si alguien sabe algo más del tema, por favor deja un comentario para aclararlo. Intentaré contactar con los creadores para comprobar si es una errata o estoy equivocado.

Actualización 24/03/2015: He contactado con ellos y efectivamente es un error.

El código completo y con comentarios por supuesto

Demo GitHub

No, esto no es el final. Aún puedo hacer varias cosas y esto es lo que me reservo para la cuarta parte de este tutorial:

  • Menú de inicio con botón Jugar, Créditos.
  • Hacer un game over y volver al menú de inicio.
  • Pausar y salir de la pausa del menú.
  • Intentaré crear dos o tres niveles.
  • Si tengo tiempo, probaré a crear power ups, quizás añadir otro tipo de enemigo.

Este artículo forma parte de una serie:

  1. ¿Cómo hacer un juego Shoo’Em Up con Quintus? – Parte 1
  2. ¿Cómo hacer un juego Shoo’Em Up con Quintus? – Parte 2
  3. ¿Cómo hacer un juego Shoo’Em Up con Quintus? – Parte 3

Las imágenes utilizadas son de SpriteLib. Los efectos de sonidos fueron creados con bfxr y eres libre de reutilizarlos si quieres. La música ambiente es obra de Isak Martinsson.

Share