Asteroids: disparos – caracteres personalizados #Programación retro del Commodore 64

Bueno, todo llega. Ya tenemos la base de los disparos: podemos crear disparos, moverlos por la pantalla, desactivarlos el llegar a los bordes de la pantalla, etc.

El siguiente paso sería dejar de usar puntos estándar (".") y empezar usar disparos personalizados. Como os podéis imaginar, desde el punto de vista gráfico la diferencia es poca. Aquí tenemos un punto estándar:

Asteroids - Punto estándar

Y aquí tenemos nuestro disparo personalizado:

Asteroids - Punto personalizado

La única diferencia es que nuestro disparo personalizado está centrado, mientras que el punto estándar anda algo alicaído.

Entonces… ¿por qué lo hacemos? Pues básicamente para aplicar lo aprendido y aprender a usar caracteres personalizados. Poco más.

¿Qué tenemos que hacer para usar caracteres personalizados? Pues todo esto:

  • Diseñar los caracteres personalizados, en este caso el disparo.
  • Exportar el juego de caracteres personalizados.
  • Importar el juego de caracteres en el juego, igual que se importan los sprites y las pantallas.
  • Configurar el VIC para que utilice el juego de caracteres personalizado, no el juego estándar.
  • A la hora de pintar los disparos, en vez de pintar un punto ("."), pintar el carácter que el VIC va a sustituir por el disparo. En nuestro caso será la "@".

Así que vamos a por ello:

Diseñar los caracteres personalizados:

Diseñar un punto es fácil. Ya lo hemos hecho arriba con el editor de caracteres de CBM prg Studio.

Pero no se trata sólo de eso. También se trata de pensar cosas como:

  • ¿Necesito diseñar un juego de caracteres completo? ¿O sólo parte?
  • Si lo rediseño completo, ¿voy a necesitar que algunos de los caracteres nuevos sean letras? ¿Voy a necesitar pintar textos? ¿O sólo gráficos?
  • Si rediseño sólo parte, ¿en qué caracteres estándar ubico mis diseños personalizados?
  • Etc.

En nuestro caso, como sólo necesitamos un punto medio centrado, y además queremos pintar textos (de hecho, ya lo estamos haciendo), lo lógico es ubicar el disparo en un carácter que no moleste mucho, que no vayamos a necesitar. Y por eso hemos elegido la "@".

Así, cuando pintemos una "@", es decir, cuando hagamos esto:

lda #$00 ; $00 es el código de pantalla de la "@"    sta $0400 ; $0400 podría ser cualquier otra dirección de pantalla

el VIC no pintará una "@", sino nuestro disparo. Esto supuesto que el VIC esté bien configurado para usar el juego de caracteres personalizado, claro.

Por eso en el editor de caracteres de CBM prg Studio hemos sustituido el diseño de la "@" por nuestro disparo.

Exportar el juego de caracteres personalizados:

Para exportar el diseño a un fichero binario –hay otras opciones de exportación– hay que seguir el siguiente proceso en el editor de caracteres de CBM prg Studio:

  • Character Set.
  • Export.
  • To File…

En el formulario que aparece elegimos "Export all characters" y finalmente indicamos el fichero destino (ej. "Caracteres.bin"):

Asteroids - Exportación caracteres

Si exportamos todos los caracteres, como hemos dicho, el fichero resultante ocupará 4K, puesto que el juego de caracteres completo tiene 512 caracteres (mayúsculas, mayúsculas invertidas, minúsculas, y minúsculas invertidas), y cada uno de ellos se define con 8 x 8 pixels = 64 bits = 8 bytes. Es decir, 512 x 8 bytes = 4.096 bytes.

Importar el juego de caracteres personalizados:

Inicialmente teníamos un fichero ensamblador llamado "Sprites.asm", pero hace ya varias entradas que lo renombramos como "Recursos.asm" para importar desde él todo tipo de recursos: sprites, pantallas, caracteres, etc.

Así que está claro, hay que ampliar este fichero para importar desde ahí los nuevos caracteres en la memoria del C64:

Asteroids - Importar caracteres

Respecto a la posición de memoria en que hacer la importación, recordemos que ésta no puede ser arbitraria. Tiene que ser al comienzo de un segmento de 2K del banco de 16K direccionable por el VIC. En nuestro caso, hemos elegido la posición $3800, que efectivamente es lo mismo que $3800 = 14.336 = 7 x 2.048.

Es decir, nos estamos yendo al último segmento, o segmento 7 (%111), del banco de 16K direccionable por el VIC:

Asteroids - Juegos de caracteres

Configurar el VIC para que use el juego de caracteres personalizados:

Como ya comentamos en la entrada dedicada a los caracteres personalizados, para indicar al VIC dónde encontrar los caracteres hay que actuar sobre los bits 1, 2 y 3 del registro VMCSB = $d018. Y recordemos que los bits empiezan a numerarse con el bit 0.

En nuestro caso, que vamos a usar el último segmento, el segmento 7, tendríamos que hacer algo así:

lda #%00001110 ; recordemos que el primer bit es el bit 0    sta $d018

Alternativamente, también podemos usar la rutina "activaJuego" de la librería "LibChars", que está programada para recibir de forma directa el número de segmento, desde 0 hasta 7, ya que internamente hace las conversiones necesarias. Obsérvese la instrucción "asl a" para desplazar los bits recibidos una posición hacia la izquierda, introduciendo un 0 en el bit 0 antes de hacer el "ora" y el "sta":

Asteroids - Activa juego

Y esto es, precisamente, lo que hacemos desde la nueva versión de la rutina "inicializaPantalla", le indicamos al VIC que el juego de caracteres personalizado está en el segmento 7:

Asteroids - Configuración juego chars

Pintar los caracteres personalizados:

Esto puede resultar un poco confuso. Lógicamente, hemos diseñado los caracteres personalizados para pintarlos, pero, a la hora de hacer esto, tenemos que usar los códigos de pantalla correspondientes a los caracteres estándar que se sustituyen.

Por eso, si queremos pintar nuestro disparo personalizado, lo que tenemos que ejecutar es esta secuencia de instrucciones:

lda #$00 ; $00 es el código de pantalla de la "@"    sta $0400 ; $0400 podría ser cualquier otra dirección de pantalla

Estas instrucciones cargan el valor $00 en la posición $0400 de la RAM de vídeo, pero, como el VIC ahora está configurado para usar un juego de caracteres personalizado, el valor $00 no lo pinta como "@", sino como nuestro disparo.

Esto puede verse en la nueva versión de la rutina "actualizaDisparos". Ya no pintamos un punto estándar ("."), sino una "@", lo que el VIC pintará como nuestro disparo personalizado:

Asteroids - Pintar disparo personalizado

Resultado final:

Gráficamente no se aprecia apenas diferencia entre el punto estándar y nuestro disparo personalizado, pero… ¿¿y lo muchísimo que hemos aprendido en relación con los caracteres personalizados??

🙂

Todo esto puede verse en la versión 08 del proyecto. En la próxima entrada ya metemos los asteroides.


Código del proyecto: Asteroids08


Editar

Josepzin

No hay comentarios:

Publicar un comentario