Codificar un juego tipo Space Invaders para Android: Parte 4

Disparando balas

Primero, añadimos algunas variables de miembros. Una x y una y para guardar la locación de las balas en la pantalla. Un RectF el cual va a ser usado para dibujar y detectar impactos en las balas. Dos variables int finales; UP (arriba) y DOWN (abajo) que SpaceInvadersView pueda usar para controlar la dirección de una bala y heading que va a mantener alguno de los dos valores; inicializamos primeramente a -1 porque no va a ningun lado por el momento. La variable speed se inicializa en 350. Estos son los pixeles por segundo a los que la bala va a viajar. Es muy rápido y representa un reto aún en una tablet de mediana resolución. Todas las balas tienen un width (anchura) y un height (altura). El width (anchura) se inicializa inmediatamente a 1 pixel, height (altura) se inicializará en el constructor y será relativo a la resolución de la pantalla. La última variable es un boolean, isActive. Podemos establecerlo a true (verdadero) y false (falso) según sea necesario para que sepamos cuando dibujar y actualizar cada bala y cuando no hay que hacerlo.

Finalmente, en el bloque de código de abajo tenemos al constructor el cual inicializa y como anteriormente se describió, establece isActive a false e inicializa un objeto RectF vacío. Ingresa el código de abajo en la clase de Bullet.

A continuación tenemos un montón de códigos get y set que pasan a rect de vuelta a SpaceInvadersView para la detección de impactos y para dibujar, regresa el estatus(isActive true (verdadero) o false (falso)) que como veremos es muy útil para saber cuando dibujar y comprobar impactos, y finalmente tenemos un método getImpactPointY el cual regresa el pixel de la mera punta de la bala. Esto va a ser diferente dependiendo si la bala va hacia abajo (disparado por un invader) o hacia arriba (disparado por el jugador). Ingresa los códigos get y set que acabamos de tratar abajo del último bloque de códigos.

A continuación tenemos el muy importante método shoot el cual trabaja primero confirmando que la bala NO este activa todavía. Si ya está activa, el disparo de la bala falla. De otra manera, una ubicación inicial de x y de y son inicializadas, el heading se activa y la bala se establece a isActive = true. Regresamos true al código del llamado para que las acciones posteriores puedan ser tomadas por un disparo de bala exitoso; es decir, reproduciendo un sonido y manteniendo el registro de la formación de invadersBullets.

Si la bala estaba activa en el momento en que este método fué llamado, el código regresa a false para permitir que el código del llamado sepa que un nuevo disparo de bala no fué posible.

Ingresa el método de shoot debajo del bloque de código anterior.

Claro, esta clase también va a necesitar un método update. Fijate que actualizamos x y y de la manera común y también actualizamos rect para que esté con lo último para dibujar y para la detección de impactos cuando sea requerido. Ingresa el método update a la clase de Bullet.

Ahora solo necesitamos inicializar, actualizar y dibujar las balas. Obviamente, no vamos a ver realmente las balas hasta que implementemos un botón de disparo para la bala del jugador y la clase de Invader la cual va a activar el disparo de las balas de los enemigos.

Fijate en los siguientes tres bloques de código que mantenemos la bala solitaria del jugador (bullet) y la formación de balas (invaderBullets) que los invaders van a usar, separadamente. No queremos perder el tiempo haciendo detección de impactos de las balas de los invaders contra los mismos invaders, así es que está bien saber cual bala pertenece a qué protagonista. Aunque vamos a detectar el daño del jugador a su propia guarida, ya que esta característica estaba en el clásico juego original.

Ingresa este código en el método de prepareLevel en el lugar que se indique en el comentario.

Ingresa este código en el método de update en el lugar que se indique en el comentario.

Ingresa este código en el método de draw en el lugar que se indique en el comentario.

Ahora podemos implementar los controles del jugador para permiterle moverse y disparar.