Buenas,
Entiendo que si consideras un malgasto mover la tabla de colores de sprites cada vez es porque los sprites que mostrarás no cambiarán de color, sólo el patrón y su posición. ¿Es así?
Se me ocurre que repitiendo dos veces los colores de los sprites en la tabla de colores, y luego cambiando en cada "frame" el plano donde muestras los sprites.
Como esta explicación no es demasiado clara
, pongo un ejemplo (ejemplo extremo):
Imagina que quieres mostrar 16 sprites (será el máximo posible).
Primero rellenas la tabla de colores de sprites: rellenas los colores para los 16 primeros planos, y repite los mismos colores en los siguientes 16 planos.
El plano 0 y 16 utilizarán el mismo color (cuando digo color me refiero a poner los mismos 16 valores en la tabla de colores), el plano 1 y 17 los mismos, etc.
plano : 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
color : 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15
En el ejemplo he puesto que cada plano utiliza un color diferente, es sólo un ejemplo exagerado.
Ahora en cada frame del juego/animación cambias el plano en el que muestras cada sprite.
Cuando pongo -- es que no se muestra ningún sprite en ese plano, creo que se hace poniendo 216 en la posición Y.
(esto último lo digo de memoria, no recuerdo bien que valor hay que poner. En MSX1 para no mostrar el sprite se pone Y=209 pero en MSX2 es otro valor)
En el primer frame muestras los sprites en los 16 primeros planos:
color : 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15
plano : 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
patron: 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
En el siguiente frame muestras el primer sprites del frame anterior como el último:
color : 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15
plano : 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
patron: -- 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
(ahora el primer sprite pasa a ser el último aunque con el mismo color)
En el siguiente frame volvemos a repetir el procedimiento anterior:
color : 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15
plano : 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
patron: -- -- 42 43 44 45 46 47 48 49 50 51 52 53 54 55 40 41 -- -- -- -- -- -- -- -- -- -- -- -- -- --
Vamos repitiendo este procedimiento hasta que todos los sprites se muestran en los planos 16-31, entonces vuelves a empezar como en el frame1 utilizando los planos 0-15.
Este "procedimiento" tiene la limitación de poder utilizar sólo 16 planos de sprites como máximo.
Además de que estás muy "enconsertado" a la hora de repartir los sprites. Porque siempre deberás utilizar los mismos planos.
Por ejemplo: el prota siempre en el plano 0, el enemigo 1 en el plano 1, enemigo 2 en plano 2, etc.
Si por ejemplo matas al enemigo 3 ... ese plano tendrás que deshabilitarlo, y en el momento de rotar planos tendrás que saltarlo.
Ejemplo: imagina que esta es la configuración del frame actual.
color : 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15
plano : 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
patron: -- -- 42 43 44 45 46 47 48 49 50 51 52 53 54 55 40 41 -- -- -- -- -- -- -- -- -- -- -- -- -- --
El enemigo 3 está en el plano 3, y lo matán ... por tanto habría que "eliminarlo", por tanto lo deshabilitamos.
color : 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15
plano : 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
patron: -- -- -- -- 44 45 46 47 48 49 50 51 52 53 54 55 40 41 42 -- -- -- -- -- -- -- -- -- -- -- -- --
si en el siguiente frame el enemigo 3 sigue muerto, cuando rotemos tendríamos que saltarnos el plano 3 e ir a por el 4:
color : 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15
plano : 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
patron: -- -- -- -- -- 45 46 47 48 49 50 51 52 53 54 55 40 41 42 -- 44 -- -- -- -- -- -- -- -- -- -- --
¿No se si me explico bien, o te he liado?
Por supuesto si utilizas menos sprites (por ejemplo 12) la estructura quedaría así (los planos 24-31 no los utilizarías):
color : 00 01 02 03 04 05 06 07 08 09 10 11 00 01 02 03 04 05 06 07 08 09 10 11
plano : 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23
patron: 40 41 42 43 44 45 46 47 48 49 50 51 -- -- -- -- -- -- -- -- -- -- -- --
Seguro que debe existir alguna manera más eficiente de hacer todo esto, además no creo que se corresponda perfectamente a lo que estás haciendo.
Pero espero que la explicación te pueda dar ideas para que encuentres una mejor solución que se adapte mejor a tu proyecto.
Saludos,