Colisiones en un software

Solo disponible en BuenasTareas
  • Páginas : 7 (1618 palabras )
  • Descarga(s) : 0
  • Publicado : 7 de marzo de 2012
Leer documento completo
Vista previa del texto
Detección de colisiones



1 Introducción


Voy a intentar trazar una serie de líneas generales sobre la “detección de colisiones”; uno de los temas más importantes y que suelen causar más problemas cuando se empieza a programar. No voy a referirme a ningún lenguaje concreto y voy a intentar ser lo más genérico posible. Tampoco esperéis ningún código “mágico”: Es un tutorial deintroducción que a nada que hayáis programado un poco, tendréis más que superado, pero que creo que puede resultar interesante cuando un “aficionado” (como yo) empieza a introducirse en esto de la programación de videojuegos.

Voy a hablar en exclusiva de la detección de colisiones en 2D (más que nada, porque de 3D no tengo ni idea ;-)), y me voy a centrar en los 2 métodos que yo creo másimportantes: Bounding Box y Píxel Perfect.

La detección de colisiones es un proceso básico en cualquier videojuego: Es necesario saber cuando nuestro personaje es alcanzado por los disparos del enemigo, o cuando va a chocar contra un muro.

Esta detección se puede hacer con distintos métodos, que tienen distintos grados de precisión y de “velocidad de cálculo”, y en función de nuestrasnecesidades deberemos escoger el más adecuado.


2 Método Bounding Box


Es uno de los métodos más conocidos. A su favor apuntaremos la simplicidad y velocidad, pero en su contra, tenemos que es un método “poco preciso” de por sí (aunque se puede optimizar bastante). Técnicamente se diría que es muy sensible, pero poco específico :-P, es decir, siempre que detecta colisión EXISTE colisión, perotambién puede detectar colisiones que no sean tales.

Se basa en detectar la colisión no del sprite en sí, sino de una “caja” que lo envuelve. Esta caja puede tener distintas formas, para adaptarse mejor al sprite: Cuadrada, circular…


1 Bounding Box cuadrada


Es la más fácil (o eso creo yo): “Envolvemos” cada sprite con una caja cuadrada, cuyas esquinas están marcadas por la posición (x,y) de origen y la longitud horizontal y vertical del sprite. Si las cajas de los sprites que queremos valorar se interseccionan, existe colisión:



Nuestro amigo calvete le está dando la mano al gangster; por lo tanto, sus cajas se interseccionan.


Las cajas no tienen porqué envolver el contorno de los sprites como en el ejemplo anterior, podemos hacerlas más pequeñas, porejemplo, que solo envuelvan el tronco del personaje, y de esa manera, obtener no obtener colisión si solo chocan las manos… es cuestión de valorar nuestras necesidades.
[pic]
El algoritmo para esta detección sería:

IF (x2 > x3 AND x1 < x4 AND y2 > y3 AND y1 < y4) ... Existe colisión

O lo que es lo mismo...

IF (x2 < x3 OR x4 < x1 OR y2 < y3 OR y4 < y1) ... No existe colisión


2Bounding Box circular


El concepto es el mismo que antes, aunque ahora vamos a envolverlo con una caja redonda. Esto lo haremos cuando la forma del sprite se adapte mejor al círculo que al cuadrado.

Ahora, por lo tanto, vamos a tomar dos valores de referencia para cada sprite: El centro y el radio de la circunferencia que lo envuelve.
[pic]
Para saber si hay o no hay colisión, tenemos quevalorar si la distancia entre los dos centros es mayor que uno de los radios: Si es mayor, no hay colisión, si es menor sí que la hay.

Para calcular la distancia entre los dos puntos, los que dejamos de estudiar matemáticas hace muchos años, nos toca desempolvar las neuronas ;). Vamos a ver:
[pic]

Como vemos, la distancia entre (x1, y1) y (x2, y2) es la hipotenusa de un triángulorectángulo, que tiene sus vértices en (x1, y1), (x2, y2) y (x2, y1).Si recordamos el teorema de Pitágoras, en un triángulo rectángulo, el cuadrado de la hipotenusa es igual a la suma de los cuadrados de los catetos, así que tendríamos que:

Distancia2 = (x2 – x1)2 + (y1 – y2)2 , luego…

[pic]

El algoritmo sería:

IF (DISTANCIA < r)… Existe colisión

El problema de este cálculo, es que al...
tracking img