Codificar un juego tipo Space Invaders para Android: Parte 2

Codificando la clase para la Activity de Space Invaders

No hay nada nuevo aquí en comparación a la clase de la Activity del proyecto de Breakout. La única diferencia es que allá no hay una clase interna extendiendo SurfaceView. Nota que como quiera creamos un nuevo objeto del tipo SpaceInvadersView y lo establecemos como la visualización para la pantalla.

También obtenemos la resolución de la pantalla y le pasamos la información a el método de constructor de SpaceInvadersView. El código de abajo mostrará varios errores hasta que implementemosla clase de SpaceInvadersView.

Tip: Estaremos usando muchas clases del Android API en este proyecto. Puedes usar el atajo “Alt + Enter” del Android Studio mientras el cursor del mouse esta flotando sobre cualquer clase de Android que esta mostrando un error. Esto añadirá la línea de importación apropiada a la parte de arriba del archivo.

Borra el código por default que se auto-generó por SpaceInvadersActivity, luego añade el código de abajo.

Ahora tenemos una clase de Activity funcionando la cual es el punto de entrada a nuestro juego de Space Invaders. Simplemente va a tomar la resolución de la pantalla, pasarsela a SpaceInvadersView en donde toda la acción del juego va a suceder. SpaceInvadersActivity no va a hacer nada a menos que reciba un mensaje del sistema operativo que le diga que está siendo apagado o reiniciado; en cualquiera de los casos va a llamar al método de pausa (pause) y al de reanudar (resume) de SpaceInvadersView los cuales va a apagar o iniciar el principal secuencia del juego.

Codificando el esquema de la clase de visualización de Space Invaders

Como ya hemos creado un montón clases vacias podemos enriquecer nuestro motor del juego junto con toda la bola de variables clave y las declaraciones de objetos ahora mismo. Ya he dividido el código inicial en varias secciones ya que el código es un poco largo. Sin embargo, no hay mucho que no hayamos visto en el proyecto pasado.

La declaración de SpaceInvadersView y las variables de los miembros

Primero que nada, en nuestro siguiente bloque de códigos, vemos que la clase de declaración necesita ser modificada para extender SpaceInvadersView e implementar Runnable para proveer funcionabilidad a nuestros dibujos y secuencias. Luego veremos un montón de objetos de miembros y variables que conocemos bien, por estar manejando nuestras secuencias, dibujos, el principal bucle del juego, los cuadros por segundo y la resolución de la pantalla. Los comentarios deberían de ser un recordatorio para saber que hace que cosa.

Empezando con la declaración del objeto de playerShip vemos las declaraciones específicas de los Space Invaders. Tenemos un objeto de PlayerShip y otro de Bullet el cual va a representar, sin ninguna sorpresa, a la nave del jugador y a su bala solitaria. Luego tenemos una formación de objetos de Bullet llamado invadersBullets junto con un par de variables de nextBullet y de maxInvaderBullets para que nos ayuden a administrar esta formación.

Después de esto, declaramos una formación para mantener todo un ejercito de objetos de Invader y otra vez, una variable para que nos ayude a administrar esta formación. Luego tenemos una formación de objetos DefenceBrick. Después veremos como construimos y destruimos a las guaridas del jugador a partir de esta formación.

Siguiendo que tenemos al objeto usual de SoundPool y a int para representar cada uno de los efectos de sonido que queremos reproducir. Luego tenemos un int que represente a score y a un int que represente a lives. Las últimas variables que declaramos son nuevas y veremos cerca del final del proyecto como usar menaceInterval, uhOrOh y a lastmenaceTime para sincronizar el aleteo de los brazos de los invaders y la rapidez del efecto de sonido de “uh oh”.

Declarando a todas las variables que acabamos de declarar hará que el progreso a través del resto del proyecto sea muchas más rápido.

El constructor de SpaceInvadersView

El constructor es el primer método que vamos a implementar. El constructor es el método que es llamado desde SpaceInvadersActivity en el código spaceInvadersView = new SpaceInvadersView(this, screenX, screenY). Así es que la primer cosa que notamos es la firma del método la cual recibe las variables que le pasaron.

Como anteriormente, le llamamos a la clase paterna (SurfaceView) para que ayude a establecer nuestro objeto con el código super(context). La siguiente línea es nueva. this.context = context copia el objeto del Context que se pasó dentro del constructor al propio objeto del context de SpaceInvadersView.

sto lo hace accesible por toda la clase y no solo en el constructor. El resto del constructor ya lo hemos visto en el último projecto. Simplemente inicializamos screenX y screenY y luego preparamos nuestros archivos de sonidos para que estén listos para reproducirse.

Finalmente, en el constructor llamamos al método de prepareLevel el cual es en donde inicializaremos todos nuestros objetos del juego y nos prepararemos para jugar el juego. Nota que en la implementación de prepareLevel hay un montón de comentarios que nos indican en donde eventualmente va el código que todavía tenemos que escribir. Agrega todo el código en el constructor y en el prepareLevel inmediatamente después del block anterior del código. Asegurate de incluir los comentarios que hay en prepareLevel como puntos de referencia para el código que pronto estaremos escribiendo.

Estamos avanzando muy bien. Solo necesitamos agregar algunos de los métodos comunes al proyecto y luego podemos continuar con la codificación de nuestro primer objeto del juego.

El método común del bucle del juego: ejecuta(run), actualiza(update) y dibuja(draw)

A continuación, vamos a agregar todo un montón de métodos que ya hemos visto anteriormente cuando vimos los tutoriales ((Mas pronto!)codificando un bucle básico de juego) y codificando un juego tipo Breakout. Sin embargo, fijate en todos los comentarios de referencia que serán de gran valor para localizar en donde va el código que pronto vamos a escribir. Agrega los métodos de abajo justo después del método de prepareLevel.

Unos cuantos métodos más que ya hemos visto antes siguen a continuación

Más de los métodos usuales: pausa(pause), reanudar(resume) y onTouchEvent

Agrega estos métodos los cuales inician y detienen nuestra secuencia y que van a detectar la entrada del jugador eventualmente.

Ahora podemos correr el juego de Space Invaders y ver solamente la puntuación y un fondo plano.

La primer foto de pantalla ejecutable del proyecto de Android de Space Invaders
La primer foto de pantalla ejecutable del proyecto de Android de Space Invaders

Ahora tenemos el esquema para nuestra clase de SpaceInvadersView, vamos a construir la nave espacial del jugador.

2 comments

  1. Hola amigo! Espero puedas responderme me urge mucho, tengo un problema y es que no puedo ejecutarlo en el dispositivo que tengo para hacerlo, ¿sabes a que se debe este problema? Seria de gran ayuda Gracias!

Comments are closed.