Asteroids: colisiones – algunas mejoras necesarias #Programación retro del Commodore 64

Si jugáis un poco con la versión 12 del proyecto enseguida observaréis que, si cruzáis el ciberespacio por su esquina superior izquierda, ya casi fuera de la pantalla, y de forma inesperada, se producen explosiones y se descuentan vidas.

¿Cómo es posible esto, si el único asteroide que está activo está viajando por otra zona del ciberespacio y no colisionamos con él? Nótese que la llamada a la rutina "actualizaAsteroidesActivos", que es la que activa más asteroides, está comentada de momento para no sucumbir al aluvión de asteroides.

La respuesta, a priori, no parece obvia. Hay que reparar que los asteroides, igual que la nave o los disparos, constan de:

  • Unas variables que controlan su funcionamiento: si están activos o no, su posición, su velocidad, su ángulo, etc.
  • Unos elementos gráficos que los representan en pantalla, ya sean sprites o caracteres personalizados.

Pues bien, en el caso de los asteroides, aunque el juego comienza con un único asteroide activo, en el sentido de que sólo una posición de la tabla "asteroidesActivos" vale $01 y, por tanto, sólo un asteroide se mueve inicialmente por la pantalla, lo cierto es que todos los sprites de los asteroides (los siete), están activos, en el sentido de activar el registro SPENA = $d015.

Esto es así porque, al inicializar los asteroides con la rutina "inicializaAsteroides", lo que hacemos es:

  • Posicionar los asteroides. El que parte activo se posiciona en X = $50, Y = $50, y los que parten inactivos se posicionan en X = $00, Y = $00.
  • Hacer la configuración básica de los sprites, lo que incluye fijar su puntero al "frame" correspondiente, activar el sprite en SPENA, y fijar su color.
  • Hacer la configuración avanzada de los sprites, lo que incluye su prioridad respecto al fondo, su configuración multicolor, y su expansión.

Dicho en claro, aunque la aplicación controla qué asteroides están activos o moviéndose por pantalla con la tabla "asteroidesActivos", en la práctica, todos los sprites asociados con asteroides están habilitados, ya sea en la posición que le corresponda o escondidos en la esquina superior izquierda (X = 0, Y = 0). Por eso, al navegar por esa esquina se producen colisiones, se animan explosiones, y se descuentan vidas.

Una vez detectado el gazapo hay que corregirlo, igual que corregimos el error consistente en que algunos disparos nacían fuera de sitio y borraban parte del texto de la derecha. La corrección lógica consiste en:

  • A la hora de inicializar los asteroides con la rutina "incializaAsteroides", inicializar sólo los que están activos para la aplicación. Y, en particular, sólo habilitar en SPENA los sprites de los asteroides que están activos para la aplicación.
  • Dado que ahora hay cosas que dejamos de hacer en la inicialización (posicionamiento inicial, configuración básica y configuración avanzada de ciertos sprites), habrá que pasar hacerlas a la hora de activar posteriormente esos asteroides, es decir, en la rutina "actualizaAsteroidesActivos".

Lo primero es fácil. Basta con verificar si el asteroide está activo antes de hacer su inicialización:

Asteroids - Nueva incialización asteroides mejorada

Y lo segundo también es fácil. Además de lo que ya veníamos haciendo (usar el Jiffy Clock para obtener de forma pseudoaleatoria los datos de posición, velocidad, ángulo y expansión), ahora tenemos que posicionar y configurar el sprite que se activa:

Asteroids - Nueva actualización asteroides mejorada

Con estos cambios ya no se producen colisiones sin sentido, porque si un asteroide no está activo para la aplicación, su sprite tampoco lo estará en el registro SPENA.

Todas estas situaciones imprevistas van surgiendo, y hay que hacerles frente. Pero no pasa nada, porque con ellas se aprende mucho.

Todo esto puede verse en la versión 13 del proyecto. Y en la próxima entrada ya tratamos las colisiones sprites – texto, es decir, entre disparos y asteroides. ¡¡A por ellos que son pocos y cobardes!!


Código del proyecto: Asteroids13


Editar

Josepzin

No hay comentarios:

Publicar un comentario