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 😄
Gracias!
Le volveré a echar un vistazo, que seguro que se me ha pasado
Por cierto, aprovechando el tema de 8BP, he echo un tutorial en video (sin audio) donde uso la herramienta
Tiled para crear un pequeño mapa (muy simple, es de ejemplo) para un juego con layout, por si interesa que lo suba
Son varios videos de poca duracion, en el que aparte de los videos, he incluido el png de los tiles, el archivo del mapa en formato CSV que se puede abrir con cualquier editor de texto, y un archivo .txt donde están los sprites de los tiles
Gracias, Xeno!
Si, ya había visto los videos del curso
También los códigos fuentes de los juegos que vienen con la librería
Me refería a crear un juego desde cero usando el lenguaje c de 8BP
En el videotutorial se explica como pasar a c el ciclo de juego, pero no el juego entero
(aunque tampoco he conseguido pasar a c el ciclo)
Hay juegos como Space Panic, Spaceman Kerl, Go to my planet que están completamente hechos en c con 8BP y la verdad es que molaría que se hiciese algún curso para hacer algo parecido.
Aunque no tan complejo como estos juegos.
Le mandé un mensaje a Fito, autor de los 2 primeros juegos, y por supuesto a JJ, autor de la librería, pero seguramente estarán muy liados.
Gracias Xeno!
Se lo comento al autor, a ver que dice.
hola toni!
perdona mi tardanza en contestar. Últimamente he estado algo «desconectado» pero vuelvo al ataque.
En el manual , capitulo 20 tienes un ejemplo en BASIC de un juego y luego el mismo juego desde cero programado en C (código fuente en pagina 200). La idea es que prácticamente sin saber casi nada de C puedas hacerlo. Incluso con la librería 8BP tienes el «minibasic.h» que al incluirlo en tu código C, te permite prácticamente programar lo mismo que has hecho en basic, pero en C, instrucción por instrucción.
En definitiva, que si haces un juego en BASIC, no vas a tener problemas en pasarlo a C por que con las indicaciones del manual y el minibasic que te proporciono, es casi una traducción linea a línea del programa basic, casi sin cambios. En ese capitulo te aseguro que tienes todo lo que necesitas, y por supuesto a mi para las dudas. Prometo contestar mas rápido
Como usuario de esta librería he de decir que es increible
Incluso se pueden hacer juegos en lenguaje c con dicha librería
Hay varios heschos, y se nota en la velocidad
Lo que haría falta es que se hiciese un tutorial de como hacer un juego desde cero en dicho lenguaje
A ver si algún experto se anima a hacer un curso para hacer un juego (aunque sea corto) en dicho lenguaje
Para los que tenemos esa espinita clavada, nos iría de lujo
Tienes todos los juegos que se han hecho con el código fuente aqui: https://github.com/jjaranda13/8BP/tree/master/GameExamples
y sobre el curso que dices: http://8bitsdepoder.blogspot.com/p/preguntas.html
hola toni!
Como he comentado en mi anterior respuesta, en el manual , capitulo 20 tienes un ejemplo en BASIC de un juego y luego el mismo juego desde cero programado en C (código fuente en pagina 200). La idea es que prácticamente sin saber casi nada de C puedas hacerlo, ayudado del minibasic.h
He puesto mas detalles en la otra respuesta
espero que te sirva. Logicamente un curso de C quedaria distorsionaría el objetivo del manual de programacion de 8BP, pero te aseguro que casi sin saber C y con el minibasic, siguiendo los pasos del manual, se puede hacer todo
En la playa con el CPC jeje