martes, 31 de enero de 2017

Disponible versión V28 de la librería 8BP

hola amigos de 8 bits de poder

Ya esta disponible la versión v28 de 8BP,  en https://github.com/jjaranda13/8BP la cual sigue ocupando lo mismo, 6KB y trae nuevas funcionalidades para la definición de rutas de sprites
(todo está documentado en el nuevo manual disponible en github):

estos nuevos mecanismos los estoy usando para programar un nuevo juego de plataformas:


Para empezar os recordaré lo que es una ruta: básicamente es un conjunto de segmentos que definen la trayectoria de un sprite. Cada segmento posee un numero de pasos , una Vy y una Vx, es decir una ruta es algo asi:

ROUTE0
    db 10,2,1 ; diez pasos con Vy=2, Vx=1
    db 5,1,-1; cinco pasos con Vy=1, Vx=-1
    db 0: fin de la ruta, al llegar aqui se empieza de nuevo

En mitad de una ruta, o al final nos puede interesar cambiar el estado del sprite. Por ejemplo eso es útil en un disparo que queremos que se desactive "solo" tras avanzar suficiente como para estar seguros de que se ha salido de la pantalla. Pues bien, también puede ser interesante hacer mas cambios en un sprite durante la ruta. Las cosas que ahora podemos hacer son 3

- Cambio de estado del sprite
- Cambio de secuencia de animación del sprite
- Cambio de imagen (útil si no tiene secuencia asociada)

Cambio de estado forzado desde una ruta
Consiste en que podemos forzar un cambio de estado en mitad de una ruta. Para
ello indicaremos que deseamos un cambio de estado indicando como valor de número de pasos del segmento = 255.
El cambio de estado es un segmento más y es importante que mantengas el mismo número de parámetros por segmento, es decir, 3 bytes. Un cambio de estado a status=13 podria escribirse como:

    255,13,0

El tercer parámetro (el cero) no significa nada, es solo un “relleno” para que el segmento mida 3 bytes, pero es imprescindible.
El valor 255 le indicará al comando ROUTEALL que lo que debe hacer esta vez es cambiar el estado del sprite, asignándole el que se indique a continuación. El cambio de estado se ejecuta sin consumir un paso, por lo que siempre se ejecutará el siguiente paso al cambio de estado. Si no queremos que el sprite se mueva mas, simplemente definiremos un segmento de un paso sin movimiento en X ni en Y justo después del cambio de estado. Veamos un ejemplo:

ROUTE3; disparo_dere
;-----------------
db 40,0,2; cuarenta pasos a la derecha con Vx=2
db 255,0,0; cambio de estado a cero
db 1,0,0; quieto Vy=0, Vx=0
db 0
ROUTE4; disparo_izq
;-----------------
db 40,0,-2; cuarenta pasos a la izquierda con Vx=-2
db 255,0,0; cambio de estado a cero
db 1,0,0; quieto Vy=0, Vx=0
db 0

Estas dos rutas las vamos a usar para disparar con nuestro personaje. La primera de ellas, tras recorrer 40 pasos en los que avanza 2 bytes en X, sufre un cambio de estado y el sprite pasa a estado 0, es decir, desactivado. El siguiente segmento solo tiene un paso y no hay movimiento (vy=0, vx=0).
Con este mecanismo podemos disparar y que los disparos se desactiven solos cuando se salen de la pantalla. Ello ahorra lógica de BASIC y acelera nuestros juegos.

Los cambios de estado se pueden forzar en cualquier segmento de la ruta, no necesariamente al final, aunque en el caso de un disparo es muy lógico hacerlo al final de la ruta.


Cambios de secuencia de animación forzados desde rutas
Podemos cambiar la secuencia de animación de un sprite usando un segmento especial. Cuando pongamos 254 en el valor del número de pasos, el comando ROUTEALL interpretará que se debe realizar un cambio de secuencia de animación en el sprite. Ejemplo:
254,10,0
Este segmento cambia la secuencia de animación del sprite, estableciendo la secuencia número 10. El tercer parámetro (el cero) no significa nada, es solo un “relleno” para que el segmento mida 3 bytes, pero es imprescindible.
Al igual que con el cambio de estado, el cambio de secuencia se ejecuta sin consumir un paso, por lo que siempre se ejecutará el siguiente paso al cambio de secuencia.


Cambios de imagen forzados desde rutas: boing, boing!!!
Hemos visto como enrutar sprites con ROUTEALL o aun mejor, con AUTOALL,1
A menudo no queremos enrutar un sprite a través de una trayectoria sino algo más cotidiano: dar un salto con un personaje


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 ATENCION, 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.


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

Y esto es todo. Os dejo con un video de preview del juego que estoy haciendo




Cuando tenga avances en el juego de plataformas publicaré mas
hasta pronto!



No hay comentarios:

Publicar un comentario