Codificar un juego tipo Space Invaders para Android: Parte 3

Implementando la clase de PlayerShip

Primero que nada tenemos una instancia RectF que será usada para la detección de impactos, luego tenemos un objeto Bitmap en el que vamos a cargar el gráfico “playership.png”, un float para cada height (altura) and length (anchura), un float para las coordenadas de x y y de la nave espacial en la pantalla y otro float, el shipSpeed el cual se refiere a cuantos pixeles por segundo se puede mover la nave espacial.

Después de esto, tenemos tres miembros final int, STOPPED (ALTO), LEFT (IZQUIERDA) y RIGHT (DERECHA) que son públicos y pueden, por consiguiente, ser accesados desde la clase SpaceInvadersView para decirle a la nave en qué dirección moverse. Luego tenemos a shipMoving a la cual se le asignará uno de los antes mencionados valores final y esto es usado internamente en el método update de esta clase para determinar que dirección moverse si es que hay que moverse.

Agrega todas estas variables y objetos de miembros justo después de la declaración de la clase.

Aquí está el constructor de PlayerShip en donde preparamos a nuestra clase de PlayerShip para defender a la Tierra. Fijate como los parámetros del método reciben un Context y a la resolución horizontal y vertical de la pantalla. Veremos como los usamos pronto.

Primero, inicializamos rect como un rectángulo vacío. Pronto se hará evidente la utilidad de este objeto cuando implementemos el método update. Inicializamos length (anchura) y height (altura) dividiendo en 10 la resolución de la pantalla en los ejes horizontales y verticales. El 10 es un valor arbitrario pero funciona muy bien. Para una nave pequeña aumenta este valor, para una nave grande, reducelo.

A continuación, inicializamos x y y en la mitad de la pantalla horizontalmente y, verticalmente, justo arriba de la parte más baja. Las variables de x y y realmente se refieren al pixel que está en la parte superior izquierda de la nave espacial, asi es que dividiendo en dos a screenX no es exactamente la mitad pero está suficientemente cerca.

Ahora cargamos bitmap con el archivo “.png” usando BitmapFactory.decodeResource y después ajustamos bitmap a la medida correcta de anchura y altura usando el método Bitmap.createScaledBitmap.
Finalmente, para el constructor, inicializamos la rapidez de nuestra nave espacial. Agrega este código justo después del bloque de códigos anterior.

Siguen algunos códigos de get y set para que spaceInvadersView pueda tomar una copia de rect para la detección de impactos, bitmap para dibujar a la nave espacial, x y length para disparar balar del mero centro de la nave, el código setMovementState le da la habilidad a onTouchEvent de determinar a qué dirección se debe de mover la nave espacial cada vez que update sea llamado.

Agrega estos métodos abajo del último bloque de códigos y luego podemos enfocarnos al método update

Y aquí está el último método de la clase de PlayerShip llamado update. Es muy sencillo al principio y ya hemos visto anteriormente como actualizamos la variable x por medio de shipSpeed dividido por los cuadros por segundo actuales a los que el juego esta corriendo y dependiente sobre el valor de shipMoving. Pero lo que pasa después es la clave a como detectamos impactos para nuestra nave espacial.

Actualizamos el inicio y el final de las posiciones verticales y horizontales de rect con la ubicación de x y y de la nave espacial. Sabemos la ubicación final sencillamente por sumar height a y y length a x.

Ahora, cuando quiera SpaceInvadersActivity llamar a getRect va a recibir un objeto de RectF el cual efectivamente envuelve la nave espacial del jugador. Este RectF puede entonces ser usado en el método RectF.intersects en exactamente la misma manera que fué usado en el juego de Breakout. Agrega el método update a la clase PlayerShip.

Eso es todo para la clase PlayerShip. Ahora podemos lo podemos poner a trabajar en tres etapas. La primera, inicializaremos uno en el método prepareLevel, después llamaremos a su método update desde update y luego lo dibujaremos en el método draw. No podremos mover ela nave espacial como quiera, hasta que implementemos completamente el método onTouchEvent lo cual haremos después de que hayamos implementado la clase Bullet.

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

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

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

Si ejecutas el juego verás la nave espacial en la parte de abajo de la pantalla.

Solo la nave espacial
Solo la nave espacial

Ahora podemos implementar la clase de Bullet