Tutorial: ¿Cómo se almacenan los sprites en las ROMs?
Y si os dijera que sería posible buscar, modificar e incluso crear sprites escribiendo tan sólo código hexadecimal directamente en la ROM? Sería algo muy friki, pero es posible, y todo lo que necesitaríamos sería la paleta de colores del sprite.
Pero partamos desde el principio.
GBA almacena, normalmente, sus sprites usando los códecs, 4bpp linear, 4bpp linear reverse order y 8bpp linear.
¿Qué significa esto?
Pues bpp = bits por píxel. O lo que es lo mismo, la cantidad de espacio que ocupa la información del color de un píxel. Por lo que si usamos el códec 4bpp, cada color ocupará 4bits.
Dicho de otra forma, este códec (4bpp) utiliza medio Byte por color, ya que, como sabemos, o si no, lo aprenderéis ahora, 1 Byte = 8 Bits.
Continuando con el C. 4bpp...
Un Bit puede estar representado por "0" o "1", encendido o apagado, etc. ¿Os suena, no? Lo que quiere decir, que si este códec usa 4 bits por color, el máximo número de colores que podemos usar será 16 (2x2x2x2).
¿Cómo indicamos el color del píxel en hexadecimal?
Los números en hexadecimal van del 0 a la F, situándose "A" tras el 9, por lo que los valores de las letras de "A" a "F" corresponden del 10 al 15. En total, hacen un total de 16 dígitos.
Con esta numeración, los colores de una paleta quedarán asignados de izquierda a derecha.
No olvidemos que en 4bpp, usamos la mitad de 1 Byte para indicar un color, por lo que es lógico pensar que en hexadecimal, 1 Byte está formado por 2 números, "0A" por ejemplo, y por lo tanto con 1 solo Byte podemos indicar la posición de 2 colores (con esto se puede empezar a entender cómo están escritos los sprites).
Para los que hayan estado atentos, habrán caído en la cuenta de que bajo esta premisa, un mismo sprite ocupará más espacio en la ROM si está configurado para ser dibujado con el C. 8bpp que con C. 4bpp, exactamente el doble de bytes. A cambio, ganamos 240 colores más.
Antes de pasar a explicar el orden de almacenamiento, quiero dejar zanjado el C.8bpp poniendo como ejemplo la paleta anterior, la cual imaginaremos que son los primeros 16 colores de una paleta de 256. Cada color será representado por 1 Byte completo en Hex.
Y así sucesitavemente hasta el color 256 = FF.
¿En qué orden escribir los píxeles?
Un sprite se compone de Tiles de 8x8 píxeles y se empezarán a escribir por Tiles de izquierda a derecha y de arriba a abajo. Y cada Tile se escribirá por líneas de izquierda a derecha de arriba hacia abajo.
Ejemplo:
Ahora solo se trataría de ir escribiendo el orden de los colores conforme a la imagen.
* La mayoría de gráficos en 4bpp, están en su modalidad "reverse order". Esto significa que el orden de los números que forman el Byte en Hexadecimal deben ponerse a la inversa.
Ejercicio de Ejemplo:
4bpp lineal 4bpp lineal reverse order
09 09 09 09 06 06 06 06
0F 0F 0F 0F 0F 0F 0F 0A
02 0F 02 0F 0E 0F 0F 0F
02 01 0F 0D 0F 0E 03 0F
01 01 01 01 0E 0D 02 03
0F 01 01 01 01 01 01 02