Asteroids: activación de nuevos asteroides #Programación retro del Commodore 64

En las entradas anteriores hemos diseñado los asteroides, los hemos inicializado y los hemos movido. Y como en las estructuras de datos, concretamente en la tabla "asteroidesActivos", sólo aparecían dos asteroides activos ($01), por la pantalla sólo se movían dos asteroides:

Asteroids - Dos asteroides activos

Lo que vamos a hacer ahora es:

  • Modificar la situación inicial para que el juego empiece con un único asteroide activo.
  • Modificar la actualización de los asteroides para que, además de moverlos, cada vez haya más asteroides activos.

Modificar la situación inicial para empezar con un único asteroide es sencillo. Llega con modificar los valores iniciales de la tabla "asteroidesActivos" para que sólo un asteroide, el primero, esté activo ($01) al comenzar el juego:

Asteroids - Solo 1 asteroide activo

Modificar la actualización de los asteroides para que cada vez haya más asteroides activos implica hacer dos cosas. La primera es ampliar la actualización de asteroides para llamar a la nueva rutina "actualizaAsteroidesActivos":

Asteroids - Actualización asteroides ampliada

Y la segunda es dotar la nueva rutina "actualizaAsteroidesActivos", que es la que se encargará de ir activando asteroides poco a poco (esto de "poco a poco" lo matizaremos más adelante):

Asteroids - Rutina actualiza asteroides activos

Esquemáticamente, lo que hace la rutina "actualizaAsteroidesActivos" es:

  • Recorre la tabla "asteroidesActivos" usando el registro Y como índice.
  • Si el asteroide está activo ($01), continúa con el siguiente asteroide.
  • Si el asteroide no está activo ($00), lo activa y termina con "rts".
  • Si ha recorrido toda la tabla, termina con "rts".

Ahora bien, en la imagen / esquema anterior no aparece el detalle de lo que hay que hacer para activar un asteroide. En la rutina sólo aparecen un comentario y unos puntos suspensivos ("; …") que en breve pasaremos a detallar.

Pero antes de entrar en los detalles de la activación, vamos a recordar lo que es el Jiffy Clock y cómo puede utilizarse para generar información aleatoria o pseudo-aleatoria.

El Jiffy Clock es un reloj similar al TOD, siendo la principal diferencia que el reloj TOD está actualizado por hardware (hay unos registros que mantienen y actualizan los valores de las horas, minutos, segundos y décimas), mientras que el Jiffy Clock está actualizado por software (interrupciones). El Jiffy Clock utiliza las posiciones $a0, $a1 y $a2, siendo $a0 la posición que cambia más despacio, y $a2 la que cambia más rápido.

El Jiffy Clock, igual que el TOD, puede usarse para muchas aplicaciones (relojes, cronómetros, alarmas, etc.) y, entre ellas, para generar valores aleatorios. Para ello, llega con leer el valor de cualquiera de sus posiciones. Si se quiere un valor que cambie rápido con el tiempo, lo más lógico es utilizar la posición más rápida: $a2.

Aclarado lo que es y para qué sirve el Jiffy Clock, volvemos a la activación de asteroides. Para activar un asteroide hay que hacer todo lo siguiente:

Asteroids - Activar asteroides

Es decir, la rutina "actualizaAsteroidesActivos", a la hora de activar un asteroide:

  • Lee el valor de la posición $a2 del Jiffy Clock y lo guarda como coordenada X del asteroide.
  • Vuelve a leer el valor de la posición $a2 y lo guarda como coordenada Y del asteroide. El motivo de volver a leer $a2, en vez de reutilizar el valor recientemente leído para X, es permitir que surjan valores diferentes para X e Y, si es que $a2 hubiera podido cambiar en tan breve lapso de tiempo.
  • Hace lo mismo con la velocidad del asteroide. Ahora bien, dado que $a2 puede tomar (en principio) cualquier valor arbitrario, y las velocidades queremos que oscilen entre 0 y 3, como con la nave, lo que hacemos es $a2 AND %00000011. De este modo, el valor resultante tiene que estar entre 0 y 3 = %00000011.
  • Hace lo mismo con el ángulo del asteroide. Ahora bien, dado que los ángulos queremos que oscilen entre 0 y 7, como con la nave, lo que hacemos es $a2 AND %00000111. De este modo, el valor resultante tiene que estar entre 0 y 7 = %00000111.
  • Hace lo mismo con la expansión del asteroide. Ahora bien, dado que la expansión sólo puede tomar dos valores, sí ($01) o no ($00), lo que hacemos es $a2 AND %00000001. De este modo, el valor resultante tiene que estar entre 0 y 1 = %00000001.
  • Todos estos valores (X, Y, velocidad, ángulo y expansión), además de generarlos de forma aleatoria a partir del Jiffy Clock, lógicamente se almacenan en las tablas correspondientes.
  • Por último, en el caso particular de la expansión, no es suficiente con actualizar la tabla "asteroidesExpansion". Además, hay que modificar la expansión horizontal / vertical del sprite. Esto se podría hacer modificando directamente los registros XXPAND = $d01d e YXPAND = $d017 pero, por aquello de reutilizar algo de código y hacerlo igual que en la inicialización, volvemos a hacer uso de la rutina "configuracionAvanzada". Esto sólo es necesario hacerlo, claro está, si en la ruleta del Jiffy Clock el asteroide ha resultado agraciado con la expansión; en caso contrario no es necesario y la rutina termina con "rts".

Y ahora vamos con el "poco a poco". Más arriba hemos dicho que la rutina "actualizaAsteroidesActivos" iba activando los asteroides "poco a poco". Sin embargo, si ejecutamos el juego casi instantáneamente vemos siete asteroides:

Asteroids - Todos asteroides activos

Al decir que la rutina actuaba "poco a poco" nos referíamos a que no activa todos los asteroides de golpe, en una única ejecución. Activa un asteroide y termina. Activa otro asteroide y termina. Y así sucesivamente hasta que los siete asteroides están activos.

Ahora bien, el código máquina es tan rápido que, según ejecutamos el juego, y casi sin darnos cuenta, ya tenemos los siete asteroides activos.

Pero este activar y terminar, activar y terminar, activar y terminar, aunque de momento no le veamos utilidad, lo que hace es preparar la rutina para más adelante. Porque más adelante, en vez de ejecutar esta rutina en cada ciclo del bucle de juego, o de forma periódica, lo que haremos será ejecutarla vinculadamente a algún evento del juego. Por ejemplo, cuando el usuario haya alcanzado X puntos o un determinado nivel. Y, entonces sí, los asteroides se irán activando poco a poco o de vez en cuando.

Todo lo descrito puede verse en la versión 10 del proyecto.


Código del proyecto: Asteroids10


Editar

Josepzin

No hay comentarios:

Publicar un comentario