Programando un juego de Breakout (Arkanoid) para Android: Parte 3

Creando la pelota

Como hicimos para nuestra clase Paddle, haz click derecho en la carpeta java en el explorador de proyecto de Android Studio y selecciona New|Java class luego selecciona …\app\source\main\java y haz click en OK. Ahora introduce Ball (pelota) como el nombre para nuestra nueva clase y haz click en OK. Hemos creado una nueva clase de Java en un archivo separado llamada Ball.

Luego de todo lo que aprendimos al programar la clase Paddle nuestra clase Ball será bastante sencilla de programar. Veamos un resumen de lo que tenemos que hacer.

  • •Nuestra pelota será un cuadrado así que necesitará un objeto RectF y un método getRect para compartir las coordenadas con BreakoutView.
  • •Nuestra pelota necesita moverse en las cuatro direcciones así que necesitará una velocidad en x y una en y. Para poder actualizar sus coordenadas mientras se mueve alrededor, necesitará su propio método update.
  • •Además cuando nuestra pelota golpee contra algo necesitará revertir su velocidad en la dirección apropiada. La pelota por sí misma no “sabe” cuando golpea contra algo así que necesitará métodos públicos para revertir velocidad, uno para x y uno para y.
  • •Al inicio del juego, la pelota necesitará resetear sus coordenadas a una situación inicial sensible justo arriba del paddle moviéndose hacia adelante.
  • •También, porque estamos haciendo una implementación muy rudimentaria de la física de rebote queremos que la pelota cuando golpee al paddle rebote con una dirección horizontal aleatoria. Necesitaremos un método para crear esta aleatoriedad.
  • •Finalmente, por experiencia, sé que la pelota a veces se quedará atorada. Por ejemplo, si detectamos una colisión cuando la pelota está unos cuantos pixeles dentro de otro objeto y se revierte su velocidad es posible que se mantenga atorada por la eternidad, constantemente yendo hacia atrás y hacia adelante. Necesitamos ser capaces de despejar obstáculos y escribiremos métodos que logren esto por ambos el eje x y el y.

Con estos requerimientos en mente, necesitaremos los siguientes métodos.

  • Un constructor simple de Ball para dar a nuestra pelota su forma.
  • Un método getRect para introducir coordenadas a BreakoutView.
  • Un método update para mover nuestra pelota basado en sus velocidades.
  • Un método reverseXVelocity y otro reverseYVelocity.
  • Un método reset para colocar la pelota en su estado inicial cada juego.
  • Un método setRandomXVelocity para seleccionar aleatoriamente en qué dirección la pelota se dirigirá luego de golpear el paddle.
  • Y para cuando se atore, los métodos clearObstacleX y clearObstacleY harán el trabajo.

Aquí está el listado del código completo para la clase Ball. Veremos a cada método en más profundidad, asegúrate de leer los comentarios para aclarar dudas.

Primero, declaramos algunas variables para contener las coordenadas, velocidad, y tamaño de la pelota y en el constructor inicializar las velocidades y el objeto rect. Nota que todavía no hemos asignado coordenadas para el objeto rect, solo lo inicializamos con cero para cada esquina.

En update cambiamos las coordenadas de la pelota con la misma fórmula que usamos en paddle solo sin las condiciones (paddleMoving) y esta vez con ambas las coordenadas x y y.

En getRect regresamos rect como hicimos para nuestra clase Paddle. En reverseYVelocity hacemos velocityY igual a -velocityY revirtiendo cual sea el signo actual y de hecho revirtiendo la dirección de la pelota en el eje y. En reverseXVelocity hacemos lo propio para los ejes de movimiento x.

En setRandomVelocity usamos un objeto de tipo Random y generamos un número con dos valores posibles. Si es el primero revertimos velocityX de la manera usual. Si es el segundo número posible no hacemos nada así que velocityX se mantiene igual.

Para aclarar, cuando la ball choca con la pared izquierda o derecha revertiremos siempre la velocidad pero cuando la ball golpea el paddle aleatoriamente la cambiaremos o la mantendremos. Esto da un efecto de diferentes tipos de impacto con el paddle. Es científicamente incorrecto pero es agradable y sencillo. Haremos física un poco más avanzada en el siguiente proyecto de juego.

Los siguientes métodos que implementamos fueron clearObstacleY y clearObstacleX dónde respectivamente rectificamos las coordenadas verticales y horizontales de la ball. Veremos pronto donde usamos esto pero es para evitar que la ball se atore.

Ya podemos ir a jugar con nuestra pelota.

Usando un objeto tipo ball

Declara un objeto tipo Ball debajo de donde declaraste el paddle.

Inicializa ball justo después de la inicialización del paddle.

Llama el método ball.update debajo de donde llamaste el método paddle.update en el método BreakoutView update.

Usa drawRect en exactamente la misma forma como hicimos para el paddle pero usa el método getRect en ball. Añade el código justo después del código para trazar el paddle.

Ahora necesitamos crear un método nuevo el cual llamaremos cada vez que un nuevo juego inicie. Añadiremos más código a este luego en el proyecto pero por ahora, solo llamamos a ball.reset. Añadimos el método createBricksAndRestart justo después del constructor en BreakoutView. El método de hecho podría ir en cualquier lugar dentro de la clase BreakoutView pero este parece un lugar lógico para él.

Finalmente para esta parte del proyecto queremos llamar a este nuevo método como la última línea de código en el constructor BreakoutView.

Ahora podemos correr el juego, pulsa la pantalla y ve la pelota volar hacia el más allá.

Programando un juego de Breakout (Arkanoid) para Android: Parte 4