domingo, 25 de septiembre de 2016

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

Hola amigos de 8 bits de poder

Ya esta disponible la versión V25 de la librería 8BP. Esta vez incluye dos interesantes y potentes funcionalidades: macrosecuencias de animación y un nuevo comando ROUTEALL. La librería sigue ocupando lo mismo, apenas 6KB. Librería y manual actualizado esta disponible en https://github.com/jjaranda13/8BP

  • Las macrosecuencias de animación permiten que un sprite cambie de secuencia de animación de un modo automático en función de su dirección (su Vy,Vx). Es muy útil porque nos permite ahorrar lógica en BASIC y por lo tanto aceleramos nuestro programa
  • El nuevo comando ROUTEALL es capaz de enrutar a los sprites por trayectorias definidas por usuario. En este caso la ventaja es tremenda, porque enrutar sprites en BASIC supone muchas instrucciones y un conocimiento profundo de la técnica de lógicas masivas. Con este comando, logras lo mismo e incluso mayor velocidad sin ser un experto en lógicas masivas.

Una “macrosecuencia” es una secuencia formada por secuencias. Cada una de las secuencias de animación constituyentes es la animación que hay que efectuar en una dirección concreta. De este modo, cuando animemos a un sprite con ANIMALL automáticamente cambiará su secuencia de animación sin que tengamos que hacer nada (en realidad no hace falta invocar a ANIMALL porque PRINTSPALL ya lo hace internamente si se lo indicamos en un parámetro).


las secuencias de animación se numeran de 1 a 31 y las macrosecuencias comienzan en la 32. Se definen de un modo muy sencillo, en el fichero de secuencias de tu juego (sequences_tujuego.asm), eso si, siguiendo un orden estricto. Es muy importante colocar las secuencias dentro de la macrosecuencia en el orden correcto, es decir, la primera secuencia debe ser para cuando el personaje está quieto, la siguiente para cuando va a la izquierda, la siguiente para la derecha, etc, siguiendo el siguiente orden (ten cuidado porque es fácil equivocarse):


por ejemplo:

_SEQUENCES_LIST
dw NAVE,0,0,0,0,0,0,0;1
dw JOE1,JOE2,0,0,0,0,0,0;2 UP JOE
dw JOE7,JOE8,0,0,0,0,0,0;3 DW JOE
dw JOE3,JOE4,0,0,0,0,0,0;4 R JOE
dw JOE5,JOE6,0,0,0,0,0,0;5 L JOE
_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,5,4,2,5,4,3,5,4;la secuencia 32 contiene las secuencias del soldado Joe

De esta manera los programas se simplifican porque no tienes que seleccionar la secuencia adecuada en función de la dirección de movimiento de cada sprite, sino que se hace automáticamente, ganando velocidad, y simplificando y clarificando más tu listado BASIC del juego

En segundo lugar tenemos el comando ROUTEALL. 
Simplifica muchísimo la programación porque puedes definir una trayectoria y hacer que un sprite la recorra paso a paso mediante el comando ROUTEALL.

Primeramente necesitas crear una ruta. Para ello necesitas editarla en el fichero routes_tujuego.asm.
Cada ruta posee un número indeterminado de segmentos y cada segmento tiene tres parámetros:
- Cuantos pasos vamos a dar en ese segmento
- Qué velocidad Vy se va a mantener durante el segmento
- Qué velocidad Vx se va a mantener durante el segmento
Al final de la especificación de segmentos debemos poner un cero para indicar que la ruta se ha terminado y que el sprite debe comenzar a recorrer la ruta desde el principio.
Veamos un ejemplo:

; 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; un circulo
;-----------------
db 5,2,0
db 5,2,-1
db 5,0,-1
db 5,-2,-1
db 5,-2,0
db 5,-2,1
db 5,0,1
db 5,2,1
db 0

Ahora para usar las rutas desde BASIC, simplemente asignamos la ruta a un sprite con el comando SETUPSP indicando que queremos modificar el parámetro 15, que es el que indica la ruta. Además, hay que activar el flag de ruta (bit 7) en el byte de status del sprite y le pondremos con el flag de movimiento automático y el de animación y el de impresión.


10 MEMORY 25999
11 ON BREAK GOSUB 280
20 MODE 0:INK 0,0
21 LOCATE 1,20:PRINT "comando |ROUTEALL y macrosecuencias de animacion"
30 CALL &6B78:DEFINT a-z
31 |SETLIMITS,0,80,0,200
40 FOR i=0 TO 31:|SETUPSP,i,0,0:NEXT
41 x=10
50 FOR i=1 TO 8
51 x=x+20:IF x>=80 THEN x=10:y=y+24
60 |SETUPSP,i,0,143: rem con esto activo el flag de ruta
70 |SETUPSP,i,7,2:|SETUPSP,i,7,33: rem macrosecuencia de animacion
71 |SETUPSP,i,15,3: rem asigno la ruta numero 3
80 |LOCATESP,i,30,70
81 REM |LOCATESP,i,200*RND,80*RND
82 FOR t=1 TO 10:|ROUTEALL:|AUTOALL,0:|PRINTSPALL,1,0:NEXT
91 NEXT
100 |AUTOALL,1:|PRINTSPALL,1,0: rem aqui AUTOALL ya invoca a ROUTEALL
120 GOTO 100
280 |MUSICOFF:MODE 1: INK 0,0:PEN 1

Ya lo tenemos todo. Esta técnica avanzada te va a simplificar la programación muchísimo con resultados espectaculares.
Como has visto, el comando no modifica las coordenadas de los sprites, de modo que deben ser movidos con AUTOALL e impresos (y animados) con PRINTSPALL. Es por ello que dispones de un parámetro opcional en |AUTOALL, de modo que AUTOALL,1 invoca internamente a ROUTEALL antes de mover el sprite, ahorrándote una invocación desde BASIC que siempre va a suponer un precioso milisegundo.

Y esto es todo. Espero que estas funcionalidades os sirvan de ayuda en la creación de vuestros fantásticos juegos

hasta la próxima!


No hay comentarios:

Publicar un comentario