20/4/15

[Tutorial] Sistema de colisiones con cajas de colisión

Buenas a todos! Por petición de @Sr_Zurdo voy a hacer un pequeño tutorial de como controlar las colisiones. Existen diferentes maneras de controlar las colisiones, yo usaré cajas de colisión que asociaremos a cada Actor del juego (el personaje principal, los enemigos, objetos a recoger del mapa, etc). Veamos como hacerlo.

Creando las cajas de colisión


A cada actor o entidad que queramos que tenga colisión le crearemos una caja de colisión. Para ello podemos usar dos clases:


Con los valores posX y posY indicamos donde queremos que se encuentre la esquina inferior izquierda de nuestro cuadrado o circulo.
Con width y height su ancho y alto respectivamente para el rectángulo.
Con radius el radio del circulo.

Puedes ver todas las funciones y otros constructores del rectángulo aquí y del círculo aquí.


Moviendo a una entidad


Una vez tenemos las cajas de colisión deberemos ir moviéndolas a la misma vez que movemos a cada entidad. Esto se hace en la función de mover el actor, que cambiará su posición una cantidad en el eje X y otra en el eje Y.

Hasta ahora tenemos varios actores con cajas de colisión que se mueven por el escenario con el movimiento que hayamos decidido (para el jugador principal puedes usar el acelerómetro o un touchpad para moverlo, por ejemplo). El siguiente paso es conseguir que los actores no avancen al chocar contra otra caja de colisión. Para ello usaremos la función overlaps, que nos indica si dos rectángulos o dos círculos se encuentran uno sobre otro.

Creamos una función en la que le pasemos la caja de colisión del actor que queremos comprobar y la caja de colisión del otro actor que queremos saber si está chocando:


Si devuelve verdadero, es que están una sobre otra, falso en caso contrario.

Esta función la tendrás que hacer para todos los actores que tenga la escena, excepto el mismo (siempre dará verdadero si haces esa función consigo mismo), decidiendo entonces si puedes moverte o no según si choca contra algún actor.

Veamos más a fondo la función de movimiento:


Para cada vez que queremos mover una entidad comprobará si se puede mover tanto en el eje X como en el eje Y. Dependiendo de si choca o no contra alguna otra entidad al intentar avanzar.

Necesitaremos tener guardado de alguna forma una lista con las entidades que tenemos en escena para comprobar si choca con alguna de ellas.


Comprobando otros elementos


No sólo puedes comparar si chocas contra otra entidad, también puedes, si usas un mapa de tiled map, crear una capa de colisión y comprobar si chocas contra algún objeto de esta capa.

También puedes comprobar si la caja de colisión se sale de la pantalla, para evitar así salirse de la escena, etc.


Notas


  • Recuerda que la función de overlaps siempre dará verdadero si comparas a un rectángulo o círculo consigo mismo.
  • Un rectángulo sólo puedes compararlo con otro rectángulo y un círculo sólo con otro círculo.
  • Aparte de mover la caja de colisión en la función de mover, luego tendrás que encargarte de dibujar en esa posición a la entidad, como siempre.