Saltar al contenido →

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

En esta segunda parte, voy a implementar los controles del jugador permitiendo que se pueda mover a izquierda o derecha y también disparar. Además, haré que los enemigos sean destruidos cuando son alcanzados por un disparo o cuando chocan con el propio jugador.

Corrigiendo bugs…

En la primera parte, el código tenía un pequeño bug que seguramente has detectado. Los enemigos colisionaban entre ellos y se paraban en medio de la pantalla en vez de seguir bajando. Esto ocurría porque al añadir el componente 2d de Quintus, éste gestiona las colisiones de esa manera, pero es posible desactivar ese comportamiento para programar tú mismo el comportamiento al colisionar. Para eso, debes de añadir la propiedad “skipCollide: true” en el objeto Enemy. De esta manera, las colisiones seguirán siendo detectadas pero no tratadas por Quintus.

Por otra parte, en algunas ocasiones, los enemigos estaban casi fuera del canvas por la parte derecha. Esto es debido a que mi código no era muy acertado para generar su posición sobre el eje X. Lo he solucionado utilizando la siguiente fórmula:

maxX es el valor de X máximo (el ancho del canvas menos 30px). minX es el valor de X mínimo (30px).

El objeto «Bullet»

Voy a crear un nuevo objeto «Bullet» que extenderá de «MovingSprite» igual que los dos primeros que he creado en la parte 1, “Player” y “Enemy”. Este objeto representará una bala disparada por el objeto “Player” cada vez que éste pulse la tecla “FIRE”. Añadiré el componente 2d a este objeto para poder controlar las colisiones y el movimiento.
Debes prestar especial atención a la propiedad “sensor: true” que añado al objeto “Bullet”. Esta propiedad permite que las colisiones sean detectadas pero que no se ejecute ninguna acción de las que Quintus tiene definidas en su módulo 2d. Prueba a desactivarlo si quieres y verás que si mantienes pulsada la tecla “FIRE” (tecla espacio en el teclado) las balas colisionan y no avanzan sino que se van desplazando hacia la izquierda una a una. Esto se soluciona con esa simple propiedad “sensor: true”.
Sobreescribo el método «step» para poder destruir las balas que salen del canvas. Si no lo hiciera, cada vez que una bala sobrepasa la parte superior del canvas seguiría avanzando indefinidamente. Por lo tanto, la destruyo en cuanto sale del campo de visión del jugador.

El módulo Input

Para implementar los controles, voy a utilizar el módulo Input de Quintus. Este módulo me permite escuchar los controles que el jugador vaya pulsando. En mi juego, quiero que el jugador sólo se mueva hacia los lados y no hacia arriba o abajo. Quintus incluye dos componentes “platformerControls” y “stepControls” pero ninguno me será de ayuda para lo que necesito. Por lo tanto voy a sobreescribir el método “step” y definir yo mismo la respuesta asociada a la pulsación de la tecla “LEFT” y la tecla “RIGHT”. Además, para disparar, añadiré un método que escuchará el evento “fire” que será lanzado por Quintus cuando el usuario pulse la tecla “FIRE”. Este método se llamará “shoot” y se encargará de crear nuevas balas.

El objeto «Player»

El objeto “Player” tiene ahora 2 métodos más “step” y “shoot”. El método “step” me permite definir el movimiento del jugador asociado a las teclas que pulsa cómo acabo de explicar. El método “shoot” me permite crear balas nuevas cada vez que se pulsa la tecla “FIRE”.

El código completo con comentarios

Demo GitHub

Esto ya empieza a ser un poco más divertido. Puedo moverme de izquierda a derecha y disparar a los enemigos. Las naves enemigas mueren al chocar conmigo y no se amontonan ya una encima de otra… Con todo esto ya sé:

  • Mover un objeto en función de los controles pulsados por alguien.
  • Gestionar colisiones entre objetos.

Lo siguiente que voy a hacer es utilizar sonidos y “animaciones”. Cambiaré la imagen de los enemigos por otra imagen simulando una explosión y pondré sonidos a los disparos y una música de fondo para ambientarlo todo. Además, crearé una interfaz de usuario en la que iré contabilizando el número de naves que el jugador ha destruido y cuantas quedan por aparecer.

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.

Share