8BP: mueve 32 sprites con lógicas masivas
Hola amigos de 8 bits de Poder, en este articulo veremos como es posible mover hasta 32 sprites con 8BP. Tal como vimos en la anterior entrega de nuestro curso de programación para amstrad CPC es posible mover un gran numero de sprites en pantalla haciendo uso de las lógicas masivas.
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.
Ahora vamos a ver un sencillo ejemplo para mover 32 sprites simultáneamente y suavemente (a 14fps). Es perfectamente posible. Solo un fantasma va a tomar decisiones en cada ciclo, aunque se van a mover todos los fantasmas en todos los ciclos.
¿32 sprites? Pero esto de que va exactamente?
Para programar un amstrad CPC en pleno 2020… quizás necesites algo de motivación a este respecto.
También podemos animar a todos (asociándoles una secuencia de animación y usando |PRINTSPALL,1,0 ) y seguirá quedando suave, pero aun parecerá que hay mayor movimiento pues el aleteo de las alas de una mosca (por ejemplo) genera mucha sensación de movimiento.
Lo que hemos hecho ha sido reducir la complejidad computacional. Hemos partido de un problema de “orden N”, siendo N el número de sprites. Suponiendo que cada lógica de sprite requiera 3 instrucciones BASIC, en principio habría que ejecutar N x 3 instrucciones en cada ciclo. Con la técnica de “lógicas masivas”, transformamos el problema de “orden N” en un problema de “orden 1”.
Se llama problemas de “orden 1” a los que involucran un número constante de operaciones independientemente del tamaño del problema. En este caso hemos pasado de Nx3= 32×3 = 96 operaciones BASIC a sólo 3 operaciones BASIC. Esta reducción de complejidad es la clave del alto rendimiento de la técnica de lógicas masivas.
A continuación, podemos ver un ejemplo de código. Puedes pegarlo en tu emulador y comprobar rápidamente el funcionamiento del mismo.
1 MODE 0 10 MEMORY 23999: CALL &6B78 20 DEFINT a-z 25 ' reset enemigos 30 FOR j=0 TO 31:|SETUPSP,j,0,&X0:NEXT 35 ' num enemigos de 12 x 16 (6bytes de ancho x 16 lineas) 36 num=32: x%=0:y%=0 40 FOR i=0 TO num-1:|SETUPSP,i,9,&8ee2: |SETUPSP,i,0,&X1111: 41 |LOCATESP,i,rnd*200,rnd*80 42 next 43 i=0 45 gosub 100 46 i=i+1: if i=num then i=0 50 |PRINTSPALL,0,0 60 |AUTOALL 70 goto 45 100 |peek,27001+i*16,@y% 110 |peek,27003+i*16,@x% 120 if y%<=0 then |SETUPSP,i,5,2:|SETUPSP,i,6,0: return 130 if y%>=190 then |SETUPSP,i,5,-2:|SETUPSP,i,6,0: return 140 if x%<=0 then |SETUPSP,i,5,0:|SETUPSP,i,6,1: return 150 if x%>=76 then |SETUPSP,i,5,0:|SETUPSP,i,6,-1: return 160 azar=rnd*3 170 if azar=0 then |SETUPSP,i,5,2: |SETUPSP,i,6,0:return 180 if azar=1 then |SETUPSP,i,5,-2:|SETUPSP,i,6,0:return 190 if azar=2 then |SETUPSP,i,5,0:|SETUPSP,i,6,1:return 200 if azar=3 then |SETUPSP,i,5,0:|SETUPSP,i,6,-1:return
En el próximo capitulo de nuestro curso veremos como funciona la ejecución alternada y periódica en cascada de la programación con lógicas masivas.
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 😄
sprites a cascoporro !!