8BP: Cómo programar un disparo múltiple en tu juego

En nuestra entrega semanal del curso 8 Bits de Poder hablaremos de como programar un disparo multiple con ayuda de la libreria 8BP.

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.
¡¡¡ Comenzamos con la entrega semanal !!!
Lo primero que debes hacer es decidir el número de disparos activos que van a poder existir. Si decides que tu nave puede disparar 3 proyectiles a la vez, entonces debes reservar 3 identificadores de sprite para disparar.
A continuación, debes ajustar el retardo entre un disparo y el siguiente para evitar que dos proyectiles salgan casi pegados si se dispara muy rápido. Esto lo puedes hacer definiendo una demora mínima entre disparo y disparo. En el siguiente ejemplo he establecido una demora entre disparos de 10 ciclos de juego, para ello, al pulsar la barra espaciadora (tecla 47) se comprueba si han transcurrido al menos 10 ciclos desde el ultimo disparo. De no ser asi, no disparará.

Programar un disparo multiple usando COLSPALL
130 'ciclo de juego – ---- 150 |AUTOALL,1:|PRINTSPALL,0,1,0 170 ' rutina movimiento personaje – --- 172 IF INKEY(47)=0 THEN IF demora<ciclo-10 THEN demora=ciclo:disp= 1+ disp MOD 3:|LOCATESP,10+disp,PEEK(27001)+8,PEEK(27003): |SETUPSP,10+disp,0,137: |SETUPSP,10+disp,15,3+dir 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
Para elegir el sprite que se va a usar como disparo se ejecuta la instrucción:
disp = 1+ disp Mod 3
Esto va a permitir que tu disparo tome los valores 1,2,3,4 alternativamente. Si necesitas que los sprites sean el 20,21,22,23 puedes usar disp = 20 + disp Mod 3 .Ojo porque si pones como sumando un 21 no funciona (pruebalo tu mismo). Es lo que tiene la aritmética modular.
Y Ahora vamos con las colisiones y la ventaja de utilizar COLSPALL, mucho más rápido que invocar múltiples veces a COLSP. Las únicas recomendaciones importantes son:
- Que nuestro <sprite number> sea superior a nuestros disparos, para que |COLSPALL lo compruebe antes que a los disparos.
- Que tengamos configurado |COLSP para solo comprobar la lista de sprites que son enemigos y son necesarios de colisionar, mediante el uso de |COLSP 32, <inicio>, <fin>
Antes de comenzar el ciclo de juego definimos nuestras variables:
collider=32:collided=32:|COLSPALL,@collider,@collided
En el ciclo de juego pondremos:
|COLSPALL:IF collider<32 THEN if collider=31 THEN GOSUB 300:goto 2000: ELSE GOSUB 770
Con esta línea ya sabemos si hay colisión, pues entonces la variable “collider” será <32. Además, si es igual a 31 entonces es nuestra nave (nos han dado) y si no, entonces seguro que uno de nuestros disparos ha alcanzado a una nave enemiga e iremos a la rutina ubicada en la línea 770, donde se encontrará algo como esto:
769' - – rutina colision disparo – --- 770 |SETUPSP, collider, 9, imgborrado:'asociamos imagen borrado al disparo 772 |PRINTSP, collider: 'borramos el disparo 775 |SETUPSP, collider, 0, 0: 'desactivamos el disparo 777 if collided>=duros then return:'enemigo indestructible 778 ' la secuencia 4 es una secuencia de animación de "Muerte", una explosion 780 |SETUPSP, collided, 7, 4:|SETUPSP, collided, 0, &x101: return
En resumen, con una sola invocación a COLSPALL ya sabemos quién ha colisionado (“collider”), y con quién ha colisionado (“collided”).
¿Cómo llevas tu juego con 8BP?
En el siguiente articulo hablaremos de como controlar quien colisiona cuando hay varios solapes de sprites.
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 😄
pasiso a pasito , bien explicado todo el desarrollo 🙂