8BP: Tabla de secuencias de animación
En nuestra entrega semanal de 8 Bits de Poder hablaremos de las secuencias de animación, que como podrás ver a continuación, son secuencias de sprites que utilizaremos para hacer posible y más reales los movimientos de nuestros personajes en el juego.
Pero espera… ¿Es posible que no sepas nada de 8 Bits de Poder? Puedes leer el primer artículo del curso de programación en Amstrad CPC de 8BP.
Las animaciones suelen componerse de un número par de fotogramas, aunque esto no es una regla estricta. Piensa por ejemplo en la animación simple de un personaje con solo dos fotogramas: piernas abiertas y cerradas. Son dos fotogramas.
Cómo hacer secuencias de animación en 8BP
Ahora piensa en una animación mejorada, con una fase de movimiento intermedia. Esto supone crear la secuencia: cerradas-intermedia-abiertas-intermedia- y vuelta a empezar. Como ves es número par, son 4.
Las secuencias de animación de 8BP son listas de 8 fotogramas, no pueden tener más, aunque siempre puedes hacer secuencias más cortas.
Los fotogramas de una secuencia de animación son las direcciones de memoria donde están ensambladas las imágenes de las que se componen, pudiendo ser diferentes en tamaño, aunque lo normal es que sean iguales. Si a mitad de la secuencia introduces un cero, el significado es que la secuencia ha terminado.
NOTA: Aunque antes de la versión V33 existía un comando RSX llamado SETUPSQ para crear secuencias desde BASIC, lo he eliminado en la V33, debido a que su uso es más complejo que definir secuencias desde el fichero sequences.asm y, de hecho, nunca he usado el comando SETUPSQ en ninguno de mis juegos, de modo que decidí sacrificarlo para ahorrar memoria.
Veamos un ejemplo de creación de una secuencia en el fichero sequences.asm
dw MONTOYA_R0,MONTOYA_R1,MONTOYA_R2,MONTOYA_R1,0,0,0,0
Antes de explicarte como asignar una secuencia a un sprite, te recuerdo como se asignan imágenes a sprites. Desde la versión V26 de 8BP, existe la posibilidad de incluir una lista de imágenes (sus etiquetas) en una lista llamada IMAGE_LIST de tu fichero images_tujuego.asm,
Con ello puedes referenciar las imágenes desde BASIC con un índice en lugar de una dirección de memoria. Así no tendrás que consultar las direcciones de memoria cada vez que ensambles. Esto aplica a la instrucción SETUPSP, #, 9, <dirección>
El ejemplo muestra una secuencia de animación de 3 fotogramas diferentes, pero para que sea fluida antes de volver a empezar hay que pasar por el fotograma “intermedio” otra vez ( fíjate que el segundo y el cuarto son iguales), de modo que al final son 4 fotogramas.
Si quisieses hacer una secuencia de más de 8 fotogramas podrías simplemente encadenar dos secuencias seguidas y cuando el personaje llegase al último fotograma de la primera secuencia usar el comando |SETUPSP para asignarle la segunda secuencia
Las secuencias de animación se ensamblan a partir de la dirección 33500 y puedes definir hasta 31 secuencias de animación (a partir del número 32 no se consideran secuencias, sino “macrosecuencias”, que es otro concepto). Cada secuencia estará identificada por un número que se encontrará en el rango [1..31]. La secuencia cero no existe, se usa para indicar que un sprite no tiene secuencia.
Para asignar una secuencia a un Sprite usa el comando SETUPSP con parámetro 7:
|SETUPSP, <sprite_id>, 7, <sequence number>
Cada secuencia almacena 8 direcciones de memoria correspondientes a los 8 fotogramas, esto son 16 bytes consumidos por cada secuencia.
Tu fichero de secuencias de animación se puede parecer a esto:
org 33500; ;===================================================================== ; hasta 31 secuencias de animacion ;===================================================================== ; debe ser una tabla fija y no variable ; cada secuencia contiene las direcciones de frames de animacion ciclica ; cada secuencia son 8 direcciones de memoria de imagen ; numero par porque las animaciones suelen ser un numero par ; un cero significa fin de secuencia, aunque siempre se gastan 8 words ; por secuencia ; al encontrar un cero se comienza de nuevo. ; si no hay cero, tras el frame 8 se comienza de nuevo ; si a un Sprite se le asigna la secuencia cero es que no tiene secuencia. ; empezamos desde la secuencia 1 ;--------------secuencias de animacion del personaje montoya-------- _SEQUENCES_LIST dw MONTOYA_R0,MONTOYA_R1,MONTOYA_R2,MONTOYA_R1,0,0,0,0 ;1 dw MONTOYA_UR0,MONTOYA_UR1,MONTOYA_UR2,MONTOYA_UR1,0,0,0,0 ;2 dw MONTOYA_U0,MONTOYA_U1,MONTOYA_U0,MONTOYA_U2,0,0,0,0 ;3 dw MONTOYA_UL0,MONTOYA_UL1,MONTOYA_UL2,MONTOYA_UL1,0,0,0,0 ;4 dw MONTOYA_L0,MONTOYA_L1,MONTOYA_L2,MONTOYA_L1,0,0,0,0 ;5 dw MONTOYA_DL0,MONTOYA_DL1,MONTOYA_DL2,MONTOYA_DL1,0,0,0,0 ;6 dw MONTOYA_D0,MONTOYA_D1,MONTOYA_D0,MONTOYA_D2,0,0,0,0 ;7 dw MONTOYA_DR0,MONTOYA_DR1,MONTOYA_DR2,MONTOYA_DR1,0,0,0,0 ;8 ;--------------secuencias de animacion del soldado – ------ dw SOLDADO_R0,SOLDADO_R2,SOLDADO_R1,SOLDADO_R2,0,0,0,0 ;9 dw SOLDADO_L0,SOLDADO_L2,SOLDADO_L1,SOLDADO_L2,0,0,0,0 ;10
Secuencias de muerte en 8BP
La librería 8BP te permite hacer “secuencias de muerte”, que son secuencias que al terminar de recorrerlas, el sprite pasa a estado inactivo. Esto se indica con un simple “1” como valor de la dirección de memoria del fotograma final.
Estas secuencias son muy útiles para definir explosiones de enemigos que están animados con |ANIMA o |ANIMAALL. Tras alcanzarles con tu disparo, les puedes asociar una secuencia de animación de muerte y en los siguientes ciclos del juego pasarán por las distintas fases de animación de la explosión, y al llegar a la última pasarán a estado inactivo, no imprimiéndose más.
Este paso a inactivo se hace automáticamente, de modo que lo que debes hacer es simplemente chequear la colisión de tu disparo con los enemigos y si colisiona con alguno le cambias el estado con SETUPSP para que no pueda colisionar más y le asignas la secuencia de animación de muerte, también con SETUPSP.
Si usas una secuencia de muerte, no te olvides de que el último fotograma antes de encontrar el “1” sea uno completamente vacío, de modo que no quede ningún resto de la explosión.
Ejemplo de secuencia de muerte (fíjate que incluye un “1”):
dw EXPLOSION_1,EXPLOSION_2,ExPLOSION_3,1,0,0,0,0
Un efecto interesante es hacer pasar por varios fotogramas repetidamente antes de terminar con un fotograma negro que sirva para borrar.
Ahora el “1” aparece en octava posición:
dw EXPLOSION_1,EXPLOSION_2, EXPLOSION_1,EXPLOSION_2, EXPLOSION_1,EXPLOSION_2, ExPLOSION_3,1
¿Qué tal llevas tu juego con 8BP?
En el próximo articulo veremos como hacer una macrosecuencia de animación con 8 Bits de Poder.
Hasta aquí hemos llegado por hoy con el curso de programación en Amstrad CPC de 8 bits de poder Si tienes alguna duda puedes escribir en comentarios y te contestaré lo antes posible.
Todos los recursos, como manuales, ejemplos y juegos compilados de este curso los puedes encontrar en el repositorio Github de 8BP.
Hasta la semana que viene amigos 😄
Con todas entregas que se están haciendo de esta librería, se facilita el aprendizaje de manera enorme !!! , gracias 🙂