8BP: Cambios de imagen forzados entre rutas

Hemos visto como enrutar sprites con ROUTEALL o aun mejor, con AUTOALL,1 ( rutas ), con 8BP
A menudo no queremos enrutar un sprite a través de una trayectoria sino algo más cotidiano: dar un salto con un personaje. En el ejemplo del capítulo 7 vimos como hacerlo con un array de BASIC que contiene los movimientos relativos de la coordenada Y. En este caso vamos a hacer lo mismo con una ruta, logrando un movimiento más veloz.


Como hacer cambios de imagen forzados entre rutas en 8BP
Para no tener que controlar si el personaje ha llegado al punto cenital del salto, podemos usar un segmento especial que indica cambio de imagen. Al igual que cualquier otro segmento, consume 3 bytes, pero en este caso el primero es el indicador de cambio de imagen (un valor 253) y los dos siguientes se corresponden con la dirección de memoria de la imagen.
MUCHA ATENCIÓN, deberás usar “dw” antes del nombre de la imagen que quieres asignar, por lo que este segmento de cambio de imagen lo tendrás que escribir en dos líneas. Un “db” para el 253 y un “dw” para la dirección de memoria de la imagen.
db 253
dw SOLDADO_R1_UP
En el ejemplo siguiente tenemos un muñeco que salta. Al subir el muñeco que se borra a sí mismo por abajo mientras que al bajar se borra a sí mismo por arriba. Para que no haya discontinuidad en el movimiento, justo al cambiar una imagen por otra es necesario realinear verticalmente al soldado, subiendo la imagen de bajada exactamente 5 lineas, para hacerla coincidir con el soldado que estaba subiendo.

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.
Este sería el fichero sequences_mygame.asm
;===================================================================== ; 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 ; al encontrar un cero se comienza de nuevo. ; si no hay cero, tras el frame 8 se comienza de nuevo ; la secuencia cero es que no hay secuencia. ; empezamos desde la secuencia 1 ;--------------secuencias de animacion -------- _SEQUENCES_LIST dw SOLDADO_R0,SOLDADO_R2,SOLDADO_R1,SOLDADO_R2,0,0,0,0 ;1 dw SOLDADO_L0,SOLDADO_L2,SOLDADO_L1,SOLDADO_L2,0,0,0,0 ;2 dw SOLDADO_R1_UP,0,0,0,0,0,0,0;3 dw SOLDADO_R1_DOWN,0,0,0,0,0,0,0;4 dw SOLDADO_L1_UP,0,0,0,0,0,0,0;5 dw SOLDADO_L1_DOWN,0,0,0,0,0,0,0;6 _MACRO_SEQUENCES ;--------MACRO SECUENCIAS ---------------------- ; son grupos de secuencias, una para cada direccion ; el significado es: ; still, left, right, up, up-left, up-right, down, down-left, down-right ; se numeran desde 32 en adelante db 0,2,1,3,5,3,4,6,4; 32 --> secuencias del soldado , id=32. la siguiente seria la 33
Usaremos dos rutas, una para saltar a la derecha y otra a la izquierda. Este sería el fichero routes_mygame.asm
; LISTA DE RUTAS ;================ ; pon aqui los nombres de todas las rutas que hagas ROUTE_LIST dw ROUTE0 dw ROUTE1 dw ROUTE2 dw ROUTE3 dw ROUTE4 ; DEFINICION DE CADA RUTA ;========================== ROUTE0; jump_right db 253 dw SOLDADO_R1_UP db 1,-5,1 db 2,-4,1 db 2,-3,1 db 2,-2,1 db 2,-1,1 db 253 dw SOLDADO_R1_DOWN db 1,-5,1; subo para que UP y down encajen db 2,1,1 db 2,2,1 db 2,3,1 db 2,4,1 db 1,5,1 db 253 dw SOLDADO_R1 db 1,5,1; baja una mas db 255,13,0; nuevo estado, ya sin flag de ruta y con flag de animacion db 254,32,0; macrosecuencia 32 db 1,0,0; quietooo.!!!! db 0 ROUTE1; jump_left db 253 dw SOLDADO_L1_UP db 1,-5,-1 db 2,-4,-1 db 2,-3,-1 db 2,-2,-1 db 2,-1,-1 db 253 dw SOLDADO_L1_DOWN db 1,-5,-1; subo para que UP y down encajen db 2,1,-1 db 2,2,-1 db 2,3,-1 db 2,4,-1 db 1,5,-1 db 253 dw SOLDADO_L1 db 1,5,-1; baja una mas db 255,13,0; nuevo estado, ya sin flag de ruta y con flag de animacion db 254,32,0; macrosecuencia 32 db 1,0,0; quietooo.!!!! db 0 ROUTE2; bird db 30,0,-1 db 10,0,0 db 20,2,-1 db 20,-2,-1 db 0 ROUTE3; disparo_dere ;----------------- db 40,0,2 db 255,0 db 1,0,0 db 0 ROUTE4; disparo_izq ;----------------- db 40,0,-2 db 255,0 db 1,0,0 db 0
Y este sería el ejemplo de programa.
10 MEMORY 23999 20 MODE 0: DEFINT A-Z: CALL &6B78:' install RSX 25 ON BREAK GOSUB 2800 30 CALL &BC02:ink 0,0:'restaura paleta por defecto 50 FOR j=0 TO 31:|SETUPSP,j,0,0:NEXT:'reset sprites 80 |SETLIMITS,12,80,0,186: ' establecemos los limites de la pantalla de juego 90 x=40:y=100:jump=0:ciclo=40:' coordenadas del personaje 100 |SETUPSP,0,0,13:|SETUPSP,0,5,0,0:' status del personaje 110 |SETUPSP,0,7,1:|SETUPSP,0,7,32:'secuencia de animacion asignada al empezar 120 |LOCATESP,0,y,x:'colocamos al sprite (sin imprimirlo aun) 123 locate 1,1: print "pulsa Q" : print "para saltar": print "ejemplo con ruta" 124 print "pulsa SPACE para disparar" 125 PLOT 1,150:DRAW 640,150: PLOT 92,150:DRAW 92,400:'suelo y pared 126 for i=1 to 4:|SETUPSP,10+i,9,26:next:'disparos 127 |MUSIC,0,0,5: 'comienza a sonar la musica 130 'ciclo de juego ------ 150 |AUTOALL,1:|PRINTSPALL,0,1,0 170 ' rutina movimiento personaje ----- 172 IF INKEY(47)=0 THEN if espera<ciclo-10 then espera=ciclo:disp= 1+ disp mod 4:|LOCATESP,10+disp,peek(27001)+8,peek(27003):|SETUPSP,10+disp,0,137:|SETUPSP,10+disp,15,3+dir 173 if peek(27000)>128 then 193 else |SETUPSP,0,6,0: ' si estado es >128 es que estoy saltando (tiene ruta) 174 IF INKEY(67)=0 THEN |SETUPSP,0,0,137:|SETUPSP,0,15,dir:'saltar 180 IF INKEY(27)=0 THEN dir=0:|SETUPSP,0,6,1:'ir derecha 190 IF INKEY(34)=0 THEN dir=1:|SETUPSP,0,6,-1:'ir izquierda 193 ciclo=ciclo+1 310 goto 150 2800 |MUSIC:MODE 1: INK 0,0:PEN 1
Para comprobar que el muñeco se encuentra saltando simplemente consultar el estado mediante un peek (27000). De este modo, sabremos si tiene el flag de enrutamiento activo y en ese caso no pasaremos por las líneas que lo mueven a derecha e izquierda.
La próxima semana veremos los cambios forzados desde rutas y cómo cambiar la ruta de un sprite usando un segmento especial.
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 😄
En la playa con el CPC jeje