Asteroids: información en la línea inferior de la pantalla #Programación retro del Commodore 64

En su momento, metimos cierta información (posición, velocidad, ángulo, vidas, puntos, etc.) en la zona derecha de la pantalla. Lo hicimos por dos motivos:

Así que matábamos dos pájaros de un tiro.

Ahora tenemos un problema, y es que los asteroides tocan ese texto y explotan. Y, aunque ese problema tendría fácil solución limitando la coordenada X de los asteroides, lo cierto es que hemos madurado. Estamos preparados para mover esa información donde siempre debió estar (arriba o abajo; elegiremos abajo) y para mover los sprites por toda la pantalla.

En esta entrada moveremos la información abajo, y en la entrada siguiente mejoraremos el movimiento de los sprites para aprovechar todo el ancho de pantalla.

De paso, repasaremos aquella lección tan importante que ya adelantamos en su momento: es mejor hacer las cosas bien desde el comienzo; arreglarlas más tarde suele costar mucho más.

Vamos a ello. Cambiar la información de posición es bien sencillo. Basta con diseñar una nueva pantalla con el editor de pantallas de CBM prg Studio. Ni siquiera hace falta un fichero nuevo; podemos reutilizar el fichero "Pantallas.sdd" introduciendo una segunda pantalla:

Asteroids - Segunda pantalla

Como en casos anteriores, habrá que exportar los datos a un fichero binario. Se puede reutilizar el fichero "Pantallas.bin". Además, no hace falta exportar las dos pantallas. Llega con que exportemos la que vamos a utilizar.

También habrá que importar la pantalla desde "Recursos.asm", así como pintarla desde la rutina "incializaPantalla" de "Pantalla.asm". Poco nuevo hasta aquí.

Habrá quien argumente que para pintar una línea en la zona inferior de la pantalla no hace falta diseñar, importar y copiar una pantalla completa (1.000 caracteres). Y no le faltará razón. Llegaría con pintar muchos espacios y, por último, pintar la línea inferior. La línea inferior se podría copiar desde una zona de memoria donde estuviera previamente cargada esa línea, o simplemente pintarla de forma directa con "sta" o "jsr chrout".

Sin embargo, en este caso, dado que venimos de una pantalla con algo más de enjundia que la última, que es muy simple, y dado el interés que también tiene manejar el editor de pantallas, y saber cómo se gestionarían éstas caso de existir, lo vamos a dejar como está.

Por último, queda una cosa importante. Hemos cambiado la disposición de la pantalla y, por tanto, cambian los límites X e Y que pueden alcanzar la nave, los disparos y los asteroides. Hay que revisarlos.

De momento sólo revisaremos los límites verticales puesto que, por mucho que hayamos quitado el texto de la derecha, ello no significa todavía que los sprites puedan moverse por esa zona. Esto llegará en la entrada siguiente.

Jugador / nave:

El control de los límites del jugador está en la rutina "actualizaPosicionJugador". Si recordamos, esta rutina hacía lo siguiente:

  • Detectaba el movimiento del joystick 2 y, en función de esto, actualizaba la velocidad y el ángulo.
  • Controlaba que la velocidad estuviera entre 0 y 3, y el ángulo entre 0 y 7.
  • Calculaba la nueva posición del jugador, utilizando para ello la rutina "calculaNuevaPosicionJugador".
  • Verificaba los límites de la nueva coordenada X (todavía no) y de la nueva coordenada Y.
  • Actualizaba el "frame" de la nave, por si había cambiado el ángulo.
  • Y actualizaba la posición de la nave.

La parte de verificar los límites de las nuevas coordenadas (X, Y) es la que vamos a revisar ahora. Tras la revisión quedan así (los límites anteriores están comentados):

Asteroids - Nuevos límites nave

Es decir:

  • La nueva coordenada X la seguimos aceptando tal cual. Cuando usemos dos bytes para el movimiento en sentido X habrá que revisar esto.
  • La nueva coordenada Y antes se limitaba entre 29 y 250 (ver instrucciones "cmp"). Ahora se limita entre 29 y 221. La reducción en el sentido Y tiene que ver con la nueva línea que hemos introducido en la parte inferior de la pantalla.

Por lo demás, observad que, aunque hemos cambiado los límites, no hemos cambiado las etiquetas. Seguimos hablando de "apjYMenor250". Esto se podría cambiar también por "apjYMenor221" para mayor claridad.

Disparos:

En los disparos había un doble control de límites. Por un lado, se controlaban los límites al mover los disparos, para hacer que estos desaparezcan al llegar a los bordes de la pantalla. Esto se hacía en la rutina "actualizaDisparos":

Asteroids - Nuevos límites disparos

Pero por otro lado también se controlaban los límites al crear los disparos, para evitar que estos nacieran fuera de los límites permitidos y borraran texto. Esto se hacía en la rutina "creaDisparo":

Asteroids - Nuevos límites disparos 2

En ambos casos, estamos hablando de disparos, es decir, caracteres (y además personalizados). Por tanto, las coordenadas (X, Y) se miden en caracteres, no en pixels. Los límites originales eran:

  • X entre 0 y 31.
  • Y entre 0 y 25.

Téngase en cuenta que "bcs" es mayor o igual (es decir, >= 0 en este caso) y "bcc" es estrictamente menor (es decir, < 25 en este caso o, lo que es lo mismo, <= 24). Por tanto, estamos permitiendo toda la pantalla en sentido vertical, desde la línea 0 hasta la línea 24, que es la última.

Debido a que hemos introducido la línea inferior, estos límites pasan a ser en ambos casos (movimiento y creación de disparos):

  • X entre 0 y 31. A revisar cuando ampliemos el movimiento de los sprites en sentido X.
  • Y entre 0 y 24.

En este caso tampoco hemos actualizado las etiquetas. Sólo el valor inmediato con el que se hace el "cmp".

Asteroides:

Los asteroides son sprites igual que la nave y, por tanto, se comportan de manera muy similar. La principal diferencia es que hay hasta siete, pudiendo estar algunos activos y otros no.

Los límites en el movimiento se aplican en la rutina "actualizaPosicionAsteroides" y son totalmente análogos a los de la nave. Los cambios, por tanto, son los mismos:

Asteroids - Nuevos límites asteroides

Es decir:

  • La nueva coordenada X la seguimos aceptando tal cual. Lo revisaremos cuando usemos dos bytes para el movimiento en sentido X.
  • La nueva coordenada Y antes se limitaba entre 29 y 250 (ver instrucciones "cmp"). Ahora se limita entre 29 y 221. Esto es por la línea que hemos introducido en la parte inferior de la pantalla.

Como en los casos anteriores, hemos cambiado los valores inmediatos con los que hacemos el "cmp", pero no hemos cambiado las etiquetas.

El resultado de todo esto es que ya hemos quitado el "mamotreto" de la derecha (¡qué alivio!) y hemos metido una línea más simple y clara en la parte inferior de la pantalla. También hemos revisado los límites de movimiento.

Las novedades las podéis ver en la versión 17 del proyecto y también aquí:

Asteroids - Texto parte inferior

En la siguiente entrada, ¡¡¡tatatachaaaaán!!!, ¡¡moveremos los sprites por toda la pantalla!! Ay madre, si lo hubiéramos hecho bien desde el comienzo…

🙂


Código del proyecto:  Asteroids17


Editar

Josepzin

No hay comentarios:

Publicar un comentario