Crea tus Juegos con 8BP

8BP: Cambios de imagen forzados entre rutas

3.6
(8)

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

9 comentarios

  1. 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

  2. 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!

    1. 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

  3. 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

    1. 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

Deja una respuesta

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

Publicaciones relacionadas

Mira también
Cerrar
Botón volver arriba