Crea tus Juegos con 8BPCursos

8BP: Colisiones entre sprites

4.9
(14)

Continuamos con otra entre del curso 8 Bits de Poder de jjaranda. en esta ocasión hablaremos de las colisiones entre sprites y de la «magia» que hace la librería 8BP para hacerlo posible.

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.

Para comprobar si tu personaje o tu disparo han colisionado con otros sprites dispones del comando :

|COLSP, <sprite_number>, @colision%

Donde sprite number es el sprite que quieres comprobar (tu personaje o tu disparo) y la variable “colision” es una variable entera que previamente ha tenido que ser definida, asignando un valor inicial, por ejemplo:

colision%=0

|COLSP, 1, @colision%

La variable “colision” se rellenará con el primer identificador de sprite que se detecte que ha colisionado con tu sprite, aunque podría ocurrir una colisión múltiple, pero el comando solo te entrega un resultado.

Colisiones entre sprites en 8BP

colisiones-entre-sprites
El mítico 664

Internamente la librería 8BP recorre los sprites colisionables desde el 31 hasta el 0 (los recorre en orden inverso), y si tienen el flag de colisión activo (bit 1 del byte de status) entonces se comprueba si colisiona con tu sprite. Si no hay colisión con ninguno, la variable colision% queda con valor 32. En caso de haberla retornará el número de sprite que esté colisionando con tu sprite. Si por ejemplo colisionan el 4 y el 12, la función retornará un 12 pues comprueba antes el 12 que el 4.

¡Ni tu personaje ni tu disparo deben tener los flag de «colisionable»(bit 1) y «colisionador»(bit 5) activos a la vez, ya que de lo contrario siempre colisionarán…consigo mismos!. Es decir un sprite no puede tener los bits 1 y 5 activos a la vez

La colisión entre sprites es una tarea costosa. Internamente la librería necesita calcular la intersección entre los rectángulos que contiene cada sprite para determinar si hay solape entre ellos. Para ahorrar cálculos, lo mejor es ubicar a los enemigos en posiciones consecutivas de sprites. Si por ejemplo los enemigos con los que podemos chocar son los sprites del 15 hasta el 25, podemos configurar la colisión para que sólo compruebe esos sprites. Para ello invocaremos la colisión sobre el sprite 32 que no existe. Eso le indicará a la librería 8BP que se trata de información de configuración para el comando, indicando el rango de sprites colisionables que se va a explorar por cada colisionador:

|COLSP, 32, <sprite inicial>, <sprite final>

Ejemplo:

|COLSP, 32, 15, 25

Esta optimización si bien no es muy significativa, lo empieza a ser cuando se invoca varias veces a COLSP o se usa el comando |COLSPALL que internamente invoca varias veces a COLSP.

Otra interesante optimización, capaz de ahorrar 1 milisegundos en cada invocación, es decirle al comando que siempre use la misma variable BASIC para dejar el resultado de la colisión. Para ello se lo indicaremos usando como sprite el 33, que tampoco existe

col%=0

|COLSP, 33, @col%

Una vez ejecutadas estas dos líneas, las siguientes invocaciones a COLSP, dejarán el resultado en la variable col, sin necesidad de indicarlo, por ejemplo:

|COLSP, 23 : REM esta invocación es equivalente a |COLSP, 23, @col%

IMPORTANTE: la variable de colision del comando COLSP no es la que se usa en el comando COLSPALL. Son variables diferentes (a menos que le pases a ambos comandos la misma variable para que actúen sobre ella)

En el próximo articulo hablaremos del ajuste en la sensibilidad de la colisión 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 😄

¿Te ha Resultado útil este artículo?

Ayúdanos a mejorar y danos tu opinión:

Mostrar más

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