Crea tus Juegos con 8BPCursos

8BP: Colisiones con solape de sprites

5
(5)

Hola amigos de 8 Bits de Poder, en esta nueva entrega semanal del curso 8BP hablaremos de las colisiones con solape de sprites. Tal como vimos en el articulo anterior, la librería 8BP nos ofrece una gran facilidad en el manejo y control de sprites.

Colisiones con solape de sprites en 8BP

Es muy importante tener en cuenta que 8BP recorre los colisionadores desde el 31 hasta el 0 y para cada uno de ellos, recorre los colisionables desde el 31 hasta el 0. Debemos asociar los Sprite ID a nuestros sprites en función de como queremos que colisionen.

¿Quién colisiona cuando hay varios solapes?

Es muy importante tener en cuenta que 8BP recorre los colisionadores desde el 31 hasta el 0 y para cada uno de ellos, recorre los colisionables desde el 31 hasta el 0.

Debemos asociar los Sprite ID a nuestros sprites en función de cómo queremos que colisionen.

colisiones con solape de sprites
Orden de comprobación de colisiones

Si nuestro sprite (colisionador) colisiona con dos sprites en la misma área, podemos saber a priori con cual de ellos vamos a colisionar, lo cual es muy útil para ciertos juegos.

Supongamos el juego “frogger”, en el que una rana debe cruzar un rio saltando sobre los troncos. Si la colisión es sobre un tronco, no moriremos, pero si la colision es sobre un rio, moriremos.

Colisiones con solape de Sprites

Para programarlo podemos poner 4 rios (4 sprites alargados inmóviles) y sobre ellos mover unos sprites que son troncos. Podriamos plantear el siguiente reparto:

  • La rana es el sprite 31 (supongamos que es colisionador)
  • Los troncos son los sprites 4 , 5 , 6, 7  (colisionables)
  • Los ríos son los sprites 0, 1, 2 ,3 (colisionables)

Los ríos pueden tener el flag de impresión desactivado, de modo que pueden colisionar con la rana (flag de collided) sin necesidad de que se impriman. Es decir, les pondríamos status =2

8BP: Colisiones con solape de sprites 1
En caso de solape nos interesa que colisione el tronco

Pues bien, como los troncos y el rio se solapan, en el momento en que la rana se sube a un tronco colisiona con ambos, pero se comprueba primero el tronco pues tiene un sprite ID mayor. El comando de colisión detectará únicamente la colisión con el tronco.

Por el contrario, si la rana salta sobre el agua, entonces el comando de colision detectará al rio y tras evaluar desde BASIC la variable collided y ver que es un rio, determinaríamos que nuestra rana debe morir.

8BP: Colisiones con solape de sprites 2

Uso avanzado del byte de status en colisiones

En ocasiones puedes querer que un enemigo no te mate al colisionar con tu personaje debido a que se encuentra en un estado especial, o porque simplemente se encuentra lejos en un juego que pretende simular que los enemigos se están acercando.

Algunas circunstancias especiales pueden requerir el uso de una “marca” en el sprite para indicar que, aunque haya habido colisión, no debe morir, o no debe matarte.

Para ello te puedes valer de los flags que no uses en el sprite y chequearlos en tu rutina de colisión.

¿Por qué programar HOY una maquina de 1984?

Vamos a ver un ejemplo para un enemigo que queremos hacer inofensivo por encontrarse lejos (simulando 3D) o con poca energía pero que colisiona con nosotros.

Supongamos que tu personaje es collided y el enemigo es collider. Puedes forzar que solo se detecte colisión con sprites mayores que 25 y si el enemigo es el numero 20 (por ejemplo) no podrá colisionar consigo mismo.

|COLSP,32,25,31

8BP: Colisiones con solape de sprites 3
Efecto de COLSP,32,25,31

Como indicador de “inofensivo” vamos a usar el flag de collided, poniéndolo a 1. De modo que pondremos al enemigo (sprite 20) dicho flag a 1 en su byte de status

Ahora supongamos que el comando |COLSPALL detecta una colision, y deja el resultado en collider y collided.

|COLSPALL
If collider<32 then GOSUB 100
<instrucciones>

100 rem rutina de colision
110 dir=27000 + collider*16 :rem dirección de byte status de collider
120 if PEEK (dir) and 2 THEN RETURN: rem inofensivo si bit collided=1
130 <ha colisionado un enemigo que no es inofensivo>

La instrucción “if PEEK (dir) and 2” es la que comprueba el bit collided ya que 2 en binario es 00000010, justo la posición de ese bit en el estado del sprite.

Cuando el enemigo deje de ser inofensivo simplemente ponemos su flag de collided a 0 y ante una nueva colisión, nos matará. Esta técnica es perfectamente valida usando cualquier otro flag que no se use.

Para la semana que viene trataremos la tabla de secuencias de animación en 8BP.

¿De cuánta utilidad te ha parecido este contenido?

¡Haz clic en una estrella para puntuar!

Etiquetas
Mostrar más

Un comentario

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Publicaciones relacionadas

Botón volver arriba
Cerrar
Cerrar