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

Detección de colisión

Todo este código va en el método update justo después de que actualizamos el paddle. Presentaré el código en pedazos manejables en el orden que deben ser introducidos. Si en algún momento no estás seguro de donde exactamente va algún pedazo de código solo salta al final de esta página y podrás ver todo el listado de la clase BreakoutGame.

Aquí hacemos un bucle a través del array de bricks con un bucle for. Para cada ladrillo, chequeamos si es visible llamando a getVisibility y si lo es usamos un método de la clase RectF llamado intersects. El método intersects toma dos parámetros RectF para que introduzcamos nuestra ball y el brick que se chequea en ese momento. Si se intersectan (han colisionado) devuelve true y el código adentro del bloque if se ejecutará. Antes de que veamos el código dentro el bloque if podrías notar la llamada un poco rara a intersects.

La sintaxis es RectF.intersects(....Actualmente estamos llamando al método en la clase, no en el objeto DE la clase. Este es un tipo especial de método conocido como método estático. Cuando un método es declarado estático permite esta funcionalidad. Métodos a menudo se declaran estáticos cuando la acción realizada en el método realmente no está en un objeto individual a pesar de que tiene sentido para la funcionalidad estar disponible con objetos de ese tipo.

Dentro de la declaración if establecemos al ladrillo para que sea invisible, revertir las pelotas y dirección de desplazamiento, añadir diez al puntaje y reproducir el sonido de explosión.

En este próximo bloque de código, usamos otra vez método estático intersects para chequear por una colisión entre dos objetos de tipo RectF. Esta vez los objetos paddle y ball. Si tenemos una colisión establecemos una velocidad aleatoria X para que la pelota pudiera rebotar ya sea para la izquierda o la derecha y revertimos la velocidad y para que vaya de nuevo hacia arriba en la pantalla. Ahora usamos nuestro método clearObstacleY para asegurarnos que la pelota no se atore en el paddle e introducimos la posición del borde superior del paddle menos dos pixeles para que el método se asegure que la pelota reanude su viaje hacia arriba empezando dos pixeles por encima del paddle. Reproducimos otro beep y estamos listos.

Ahora manejamos una colisión con el borde inferior de la pantalla. El borde inferior de la pantalla obviamente no es un RectF así que no podemos usar el método intersects pero si sabemos la coordenada exacta del borde; es screenY. Así que solo hacemos la prueba de si el borde inferior de la pelota es mayor al borde que screenY. Si lo es la pelota ha chocado con el borde inferior de la pantalla. Entonces revertimos la velocidad en y, usamos el clearObstacle para despejar el fondo de la pantalla por dos pixeles, restamos una vida y reproducimos un ruído sordo y sombrío. Finalmente en el bloque de código de abajo probamos para ver si el jugador tiene cero vidas y si es así pausamos el juego y llamamos a createBricksAndRestart para rearmar el juego desde el principio.

El siguiente bloque de código prueba si la pelota ha tocado el tope de la pantalla. Me encanta cuando la pelota rebota entre los bloques superiores, me da un subidón de dopamina y me recuerda cuando jugada este juego de niño. Sí, soy así de viejo. De vuelta al código. Probamos que el tope de la pelota sea menor a cero y si es así revertimos la velocidad en Y despejamos el tope de la pantalla por 12 pixeles y reproducimos un beep. La razón para despejar el tope de la pantalla es porque el método clearObstacleY funciona en el borde inferior de la pelota y la pelota tiene diez pixeles de alto.

El siguiente bloque de código rebota la pelota del borde izquierdo de la pantalla. Todo el código se explica solo a este punto, solo nota que revertimos la velocidad en x, no la velocidad en y.

El siguiente bloque de código rebota la pelota del borde izquierdo de la pantalla. Todo el código se explica solo a este punto, solo nota que revertimos la velocidad en x, no la velocidad en y.

Aquí chequeamos si score iguala a numBricks multiplicado por diez. Esto indicaría que todos los bloques han sido destruidos así que reiniciamos el juego de la manera usual.

Ahora puedes correr y jugar Breakout.

programando-un-juego-de-breakout-para-android

Que sigue

Felicitaciones por completar el juego. Habrá más proyectos de juegos completos muy pronto. En estos proyectos, incrementaremos el número y variedad de objetos en nuestro juego y mejoraremos de modo significativo las características del motor de juego. Un siguiente paso adecuado sería intentar el Android Space Invaders project (Proyecto de Space Invaders en Android).

Y finalmente como fue prometido aquí está el listado completo de la clase BreakoutGame y su clase interna BreakoutView.