Teoría de
colisiones
Cómo saber si dos objetos se tocan, usando solo su posición y su tamaño.
Usa las flechas o los puntos de arriba para avanzar.
¿Qué es una colisión?
En un juego, una colisión ocurre cuando dos objetos ocupan el mismo espacio al mismo tiempo. Detectarla es lo que permite que un personaje choque contra una pared, recoja un objeto o sea alcanzado por un enemigo.
Comparar la forma exacta de cada objeto sería costoso, así que en la práctica se los simplifica.
Un objeto, un rectángulo
Cada objeto se reduce a un rectángulo definido por una posición (x, y) y un tamaño (ancho, alto). Ese rectángulo es su "caja de colisión".
Usamos la misma convención que OpenCV: x crece hacia la derecha y y crece hacia abajo, y (x, y) es siempre la esquina superior izquierda del objeto — la misma que devuelve una imagen leída con cv2.imread.
Solapamiento en los dos ejes
Dos rectángulos chocan cuando sus intervalos se solapan a la vez en el eje X y en el eje Y.
Dos intervalos se solapan cuando cada uno empieza antes de que el otro termine:
Esa misma regla se aplica dos veces: una en X, otra en Y.
Solapamiento en X
Se solapan en X si cada uno empieza antes de que el otro termine. Arrastra el rectángulo A.
Solapamiento en Y
La misma idea, en vertical: se solapan en Y si cada uno empieza antes de que el otro termine. Arrastra el rectángulo A.
Por qué hacen falta los dos
Que se solapen en X no alcanza: uno puede estar mucho más arriba que el otro, en la misma columna pero sin tocarse. Lo mismo al revés con Y.
Recién cuando ambos rangos se cruzan a la vez, los rectángulos se superponen de verdad en el plano.
Ambos ejes a la vez
Hay colisión cuando hay solapamiento en X y solapamiento en Y, al mismo tiempo. Arrastra el rectángulo A por el plano.
Esa es la base
Con estas reglas ya se puede detectar si dos rectángulos se tocan, sin importar dónde estén ni qué tamaño tengan. Así se escribe en Python, y es la función que vamos a usar durante toda la clase:
def hay_colision(xA, yA, anchoA, altoA, xB, yB, anchoB, altoB):
solapan_en_x = (xA < xB + anchoB) and (xB < xA + anchoA)
solapan_en_y = (yA < yB + altoB) and (yB < yA + altoA)
return solapan_en_x and solapan_en_y
(x, y) es la esquina superior izquierda de cada objeto, tal como la entrega OpenCV.
Siguiente paso: aplicarlo a un caso concreto. Lo vemos con un ejemplo.