Asteroids: el reto de los asteroides que siempre se expanden (solución) #Programación retro del Commodore 64

No podemos rematar la faena sin resolver el gran misterio. ¿Por qué cada vez había más asteroides expandidos y menos sin expandir?

La respuesta no estaba en la rutina "actualizaAsteroidesActivos", como podría parecer, sino que estaba en la rutina "configuraAvanzada" de la librería "LibSprites.asm". La versión original de esta rutina era así:

Asteroids - Rutina configuración avanzada

Si estudiamos la parte de la rutina dedicada a la expansión (líneas 148 – 164) veremos que la rutina es capaz de pasar de una situación inicial en que el sprite no está expandido, a otra situación final en que sí lo está. Esto se consigue haciendo "ora XXPAND" y "sta XXPAND", para la expansión horizontal, y "ora YXPAND" y "sta YXPAND", para la expansión horizontal.

Pero la rutina no es capaz de deshacer esa situación. Es decir, la rutina no es capaz de "desexpandir" un sprite que previamente ya está expandido.

Es decir, la rutina se diseñó para, partiendo de la situación inicial o de arranque del C64 en que ningún sprite está expandido, expandir los sprites que se desee. Pero no se diseñó para hacer también el camino contrario.

Por ello, según avanzaba el juego, algunos asteroides se expandían y otros no. Los expandidos nunca se "desexpandían". Y los no expandidos, por el mero paso del tiempo y los juegos de probabilidades, antes o después acababan expandidos, sin poder salir de ahí. Al final, todos expandidos.

Sin embargo, a partir de la versión 19 del proyecto, esta rutina se mejora y pasa a ser así (sólo parte dedicada a la expansión):

Asteroids - Rutina configuración avanzada mejorada

Es decir, cuando "caExpansionH" vale 0:

  • Con "lda tablaSpr,x" se obtiene un byte con todos los bits a 0 menos el correspondiente al sprite, que estará a 1.
  • Con "eor #%11111111" se cambian todos los bits de ese byte. Es decir, quedan a 1 todos los bits, menos el correspondiente al sprite, que queda a 0.
  • Con "and XXPAND"y "sta XXPAND" lo que se consigue es desactivar la expansión horizontal del sprite en cuestión.

Y lo mismo para la expansión vertical cuando "caExpansionV" vale 0.

Espero que esto aclare el misterio. A mí me tuvo loco mucho tiempo

🙂
.


Editar

Josepzin

No hay comentarios:

Publicar un comentario