domingo, 6 de diciembre de 2015

Una de sprites

Veréis, llevo unos meses aprendiendo a programar en ensamblador de C64 y durante este tiempo he aprendido algunas cosas interesantes sobre cómo funciona internamente nuestra estimada panera, cómo representa los elementos gráficos de mis videojuegos favoritos y qué aplicaciones se usan en la actualidad para crear juegos. Una de las herramientas que muchos desarrolladores del presente usan para crear gráficos para juegos actuales de Commodore es un programa para Windows llamado Sprite Pad. Este editor de sprites permite importar una snapshot o instantánea (fichero .vsf) de ejecución del emulador VICE y extraer la información de los sprites de un juego para usarlos posteriormente o simplemente para cotillear. Y es este programa el que me ha revelado algunas curiosidades que desconocía. Con este artículo pretendo compartir estas curiosidades con vosotros, aunque posiblemente muchos de los que lo leáis ya las conozcáis, pero bueno...
El mítico globo que venía como ejemplo de sprite en el manual del C64, ¿lo recordáis?

¿Cómo funcionan los sprites en C64? La teoría

Esto imagino que ya lo sabréis casi todos: en el C64, un sprite es un conjunto de pixels agrupados en una bloque de 21x24 puntos, que puede ser o bien monocolor (1 solo color y transparencia) o bien multicolor (hasta 3 colores y transparencia pero con resolución de 21x12), y que el Commodore soporta en número de hasta 8 simultáneamente en pantalla. Todos los sprites multicolor comparten 2 colores y cada uno tiene 1 color particular. Estos sprites son manejados y dibujados directamente por hardware (chip MOS 6569 VIC-II) al contrario que otros micros como el ZX Spectrum o el Amstrad CPC, lo cual libera a la CPU de carga y permite sacar más rendimiento a ese 1MHz del 6510. El VIC-II puede detectar colisiones entre sprites y entre sprites y elementos del fondo, lo cual es otra comodidad interesante a la hora de programar.
En el nº22 de Commodore Magazine nos enseñaban cómo hacer sprites múltiples.

Vamos con algunas características y técnicas...

Expansión

El VIC-II puede expandir (duplicar su tamaño) los sprites horizontal y/o verticalmente, lo que implica sprites más grandes pero menos detallados. Un ejemplo de esta expansión horizontal de sprites es el clásico International Soccer, en el que tenemos los jugadores como sprites multicolor expandidos verticalmente y el balón como sprite multicolor. En juegos como Creatures o Mayhem in Monsterland también se usan sprites expandidos en algunos enemigos.
International Soccer y sus sprites marcados.
Los sprites de International Soccer sin expandir en Sprite Pad.

Overlay (superposición)

El C64 permite mezclar sprites monocolor y multicolor en pantalla, y también superponer unos sobre otros. Colocar un sprite monocolor sobre uno multicolor nos puede dar un bonito personaje en alta resolución con 4 colores más transparencia, lo que mejora la calidad gráfica del juego a costa de gastar 2 sprites por personaje en lugar de 1. Un ejemplo de esta técnica está en el Rick Dangerous que tenemos a continuación, pero muchos más juegos la emplean, como Microprose Soccer, Batman The Movie, el infame Human Killing Machine, Rodland o el Mayhem in Monsterland mencionado anteriormente. 

Rick Dangerous.

Aquí tenemos el sprite de "contorno" de Rick...

...y aquí está superpuesto al sprite multicolor de fondo.

Overlay + expansión

Suponed que tenéis que mostrar un personaje de 2 sprites de alto en alta resolución. De entrada uno piensa: pongo 2 sprites multicolor de fondo, 2 monocolor encima y voilà! Pero, ¿y si ponemos un sprite multicolor expandido de fondo y dos monocolor encima? Así conseguimos un sprite doble en alta resolución coloreado y nos ahorramos 1 sprite que podemos usar para otro personaje, el marcador, etc. Este truco se emplea en los personajes del Street Fighter versión EE.UU. que vemos abajo, pero también en el Target Renegade y muchos otros. 

Street Fighter versión EE.UU.

Sprite de fondo de Ryu sin expandir seleccionado, en la parte derecha se ve, con los píxeles negros, el sprite de contorno de la parte superior de Ryu.

Multiplexación

¡Esto es pura magia! ¿Recordáis que antes os he dicho que el C64 puede mostrar hasta 8 sprites simultáneamente? Bueno, pues  no es del todo cierto. Sí, son 8 sprites, pero por línea de refresco de pantalla, y se pueden mostrar más de 8 gracias a las interrupciones de barrido (hay otra manera, pero no la vamos a ver aquí), que es un mecanismo de la CPU que, de manera resumida, permite ejecutar rutinas de código cuando la ejecución del programa coincide con el "pintado" de una determinada línea de la pantalla, ya que ésta se dibuja de izquierda a derecha y de arriba hacia abajo. El funcionamiento sería algo así: el bucle del juego dibuja primero unos cuantos sprites en la zona superior de la pantalla, y cuando el dibujado de la pantalla llega, por ejemplo, a la línea 160, dibuja el resto de sprites del juego, borrándose los que había mostrado anteriormente. Esto también se usa en juegos de pantalla partida como el gran Pitstop II, los Spy vs Spy, el Sanxion que tanto gusta a Bieno o Bonanza Bros.
En la Commodore World de marzo de 1986 nos explicaron cómo mostrar hasta 64 sprites simultáneamente.

Ahora estaréis pensando: ¿esto es lo que provoca que en algunos juegos los sprites parpadeen (Silkworm, por ejemplo). Pues sí, ya que en un mismo frame algunos sprites están y no están a la vez (son los sprites de Schrödinger... olvidadlo), pero al hacer este cambio tan rápidamente (50 fps en PAL y 60 fps en NTSC), nuestro ojo prácticamente no lo detecta. Esta técnica es la llamada multiplexación de sprites, y anteriormente ya se empleaba en la Atari 2600, y microordenadores como el MSX o consolas como la Master System y la NES la soportan. Una de las ventajas de esta técnica es que permite que los sprites mostrados en las diferentes zonas de la pantalla se salten las limitaciones de colores comunes, y así tener 8 sprites con unos colores en la zona superior y otros 8 con colores diferentes en la zona inferior. Las desventajas, bueno, aparte de complicar el código y aumentar el número de variables a usar para mostrar los sprites, la multiplexación consume ciclos de CPU y en algunos casos puede provocar ralentizaciones (esto es visible en el Pang! cuando tenemos muchas burbujas en pantalla). 

Psycho Pigs UXB y los sprites enumerados.

Sprites del juego en Sprite Pad.

Aquí tenéis un par de juegos que usan esta técnica, arriba el divertido Psycho Pigs UXB y abajo el Cabal versión Ocean. Aunque hay centenares de títulos que la emplean, como Tapper, SWIV, R-Type, Smash TV, etc. 

Cabal versión Europa. Fijaros en la impresionante cantidad de sprites mostrados simultáneamente. Nuestro personaje necesita 3.

Cabal emplea sprites expandidos como fondo de sprites en alta resolución, además de multiplexación.

Si queréis "diseccionar" los sprites de vuestros juegos favoritos como lo he hecho yo, los pasos serían estos:

  1. Abrid el emulador VICE y ejecutad el juego.
  2. Cuando comencéis a jugar, vais al menú del programa (en algunas versiones para Linux se accede pulsando F12) y allí vais a Snapshot->Quicksave snapshot.vsf.
  3. Ahora abrís Sprite Pad y vais a File -> Import/Export -> VICE snapshot -> Import sprite data.
  4. En la nueva ventana pulsáis Select Snapshot File, buscáis el fichero .vsf que habéis creado con VICE en la carpeta en la que está el fichero del juego.
  5. Al abrir el fichero, os dará a elegir el banco de memoria que queréis editar. Estos bancos aparecen en la parte de abajo en el apartado Video Bank ( 0 - $0000 - $3FFF, etc). Pulsando cada selector veréis que aparecen sprites y/o basura, que indicará que ahí hay datos que no son sprites. Seleccionáis el banco que queráis y pulsáis Ok.
  6. En la pantalla principal de Sprite Pad ya tendréis todos los sprites cargados y podréis examinarlos y editarlos a vuestro gusto. Incluso podéis guardarlos por si queréis incluirlos en algún proyecto...
Como habéis visto, muchos programadores sabían exprimir al máximo las características del Commodore y sobreponerse a sus limitaciones en cuanto a sprites se refiere, empleando técnicas que incrementaban la calidad gráfica y la jugabilidad de sus títulos para mayor deleite nuestro. Bueno, espero no haberos aburrido con el ladrillo, y si alguno de vosotros ha aprendido algo nuevo sobre nuestra máquina favorita, mejor.


Salu2, Paco.

4 comentarios:

  1. Una entrada MUY interesante, a ver si te pasas más por el foro y nos cuentas en qué andas metido.

    No sabía lo de usar un solo sprite ampliado en vertical para colorear, yo siempre contaba 4 para el personaje. Vaya genios :)

    ResponderEliminar
    Respuestas
    1. Gracias Josep!!! Yo tampoco sabía lo de los sprites expandidos para colorear personajes, pensaba lo mismo que tú. Truquitos de programadores, ya ves. Me he pasado por el foro y vaya descubrimiento, no lo conocía. He pedido el alta ;-)

      Eliminar
    2. Gracias Josep!!! Yo tampoco sabía lo de los sprites expandidos para colorear personajes, pensaba lo mismo que tú. Truquitos de programadores, ya ves. Me he pasado por el foro y vaya descubrimiento, no lo conocía. He pedido el alta ;-)

      Eliminar
    3. ¿Que no lo conocías?? pero eso es penado con carcel y quita de Commodores 64 :O :O

      Eliminar