Crea tus Juegos con 8BP

8BP: Cambios de imagen forzados entre rutas

3.3
(6)

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.

rutas
8BP: Cambios de imagen forzados entre rutas 2

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.

rutas avanzadas

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 😄

¿Te ha Resultado útil este artículo?

Ayúdanos a mejorar y danos tu opinión:

Mostrar más

Un comentario

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Publicaciones relacionadas

Botón volver arriba