Colisiones de sprites

Con las colisiones de sprites ocurre algo similar a lo que ocurre con las prioridades, es decir, hay de dos tipos:

  • Colisiones entre sprites.
  • Colisiones entre sprites y el fondo.

Es importante señalar que, en ambos casos, la colisión se produce cuando una parte activa del sprite entra en contacto con la parte activa de otro sprite o del fondo. Es decir, para que se produzca una colisión no es suficiente con que la matriz 24×21 de un sprite se solape con la matriz 24×21 de otro sprite; tienen que solaparse o entrar en contacto partes activas, es decir, pixels que están activados.

Colisiones entre sprites

Las colisiones entre sprites se señalizan mediante el registro del VIC $d01e. Cuando dos sprites colisionan, se activan sus bits correspondientes en este registro. Y estos bits permanecen activos hasta que se lee el registro con una instrucción de carga o lectura de datos (“lda”, “ldx” o “ldy”).

Una cuestión a tener en cuenta es que, si colisionan más de dos sprites, por ejemplo, si colisionan cuatro sprites dos a dos, el registro $d01e nos dirá qué sprites se han visto involucrados en las colisiones, pero no quién ha colisionado con quién. Por tanto, para tener una información completa sobre la situación será necesario tener en cuenta también las posiciones de los sprites.

Colisiones entre sprites y fondo

Las colisiones entre sprites y el fondo se señalizan mediante el registro del VIC $d01f. Cuando un sprite colisiona con el fondo, se activa su bit correspondiente en este registro. Y ese bit permanece activo hasta que se lee el registro con una instrucción de carga o lectura de datos (“lda”, “ldx” o “ldy”).

Como en el caso anterior, una cuestión a tener en cuenta es que, si colisionan con el fondo dos sprites o más, el registro $d01f nos dirá qué sprites se han visto involucrados en las colisiones, pero no quién ha colisionado con qué. Por tanto, para tener una información completa sobre la situación será necesario tener en cuenta también las posiciones de los sprites.

Interrupciones

Los registros descritos anteriormente ($d01e y $d01f) sirven para obtener información sobre las colisiones. Pero además de obtener información, normalmente habrá que gestionar esas colisiones, es decir, el programa tendrá que responder ante ellas ejecutando algún código (ej. descontando vidas, sumando puntos, etc.).

Por supuesto, el programa podría estar validando constantemente (o cada cierto tiempo) los registros $d01e y/o $d01f, pero normalmente será más cómodo usar interrupciones, de modo que, cuando se produzca una colisión, se ejecute instantáneamente una rutina de interrupción.

Los detalles de las interrupciones generadas por el VIC se verán en detalle más adelante.

colisiones


Programa de ejemplo: Prog37

Deja un comentario