Una colisión es una pregunta sobre dos formas
Una colisión es el momento en que dos objetos de un juego se tocan, y el código la detecta comparando sus formas. Se usa para recoger una moneda, recibir un golpe o saber si un disparo ha dado en el blanco.
Al final sabrás decidir si dos rectángulos o dos círculos se solapan, con una sola comparación. Verás la prueba que usa Catch the stars para atrapar una estrella.
Al terminar esta lección
Nota
Puedo detectar una colisión entre dos rectángulos o entre dos círculos y decir si se tocan.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Colisión | dos objetos del juego que se tocan o se solapan | |
| Rectángulo | una caja con posición x, y, ancho y alto | x, y, w, h |
| Solapar | compartir una parte del espacio, no solo un borde | |
| Círculo | una forma con un centro y un radio | x, y, r |
| Distancia | lo lejos que están dos centros | dx, dy |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Rectángulos: se solapan en los dos ejes
Cada objeto del juego tiene una caja. Su x y su y son la esquina de arriba a la izquierda, y w y h son el ancho y el alto.
Dos cajas se solapan cuando cada una empieza antes de que termine la otra, tanto a lo ancho como a lo alto. Si falla una sola de las cuatro comparaciones, no hay colisión.
La prueba de colisión del juego del laboratorio
function overlaps(a, b) {
return a.x < b.x + b.w
&& a.x + a.w > b.x
&& a.y < b.y + b.h
&& a.y + a.h > b.y;
}Un ejemplo con números: cuatro comparaciones
| Caja A | Caja B | Las cuatro comparaciones | Resultado |
|---|---|---|---|
| x 0, y 0, 10 por 10 | x 5, y 5, 10 por 10 | 0 < 15, 10 > 5, 0 < 15, 10 > 5: todas ciertas | Se solapan |
| x 0, y 0, 10 por 10 | x 20, y 0, 10 por 10 | 0 < 30 cierta, 10 > 20 falsa | No se solapan |
| x 0, y 0, 10 por 10 | x 10, y 0, 10 por 10 | 0 < 20 cierta, 10 > 10 falsa | No: solo se tocan |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Mira seis pares de cajas en el laboratorio
El laboratorio tiene un script que repite esa misma prueba en Python con seis pares de cajas fijos. Escribe en inglés el nombre de cada par y True o False.
Verás overlapping, one inside the other y one corner inside con True. Los otros tres, apart, edges touching y same column, far apart, dan False.
Probar seis pares de cajas
docker exec jupyter python3 steps/collide.pySe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Dónde llama el juego a la prueba
El juego solo escribe la prueba una vez y la llama para cada estrella en cada fotograma. Si da cierto, suma un punto y quita la estrella.
El comando busca la palabra overlaps en game.js. Escribe dos líneas: la 38, donde se define la función, y la 76, donde se usa con la estrella y el jugador.
Buscar dónde se define y se usa overlaps
docker exec jupyter grep -n "overlaps" game/game.jsSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Dos círculos se tocan si están cerca
Un círculo tiene un centro y un radio. Dos círculos se solapan si la distancia entre sus centros es menor que la suma de sus radios.
Calcular la distancia exige una raíz cuadrada, que es lenta. Se evita comparando los cuadrados: dx * dx + dy * dy contra (r1 + r2) * (r1 + r2), donde dx y dy son las diferencias de los centros.
La prueba de dos círculos en Python
# Dos círculos se tocan si la distancia entre centros es menor que la suma de radios.
# Se compara el cuadrado de las dos cosas, y así no hace falta la raíz cuadrada.
def circles_overlap(a, b):
dx = a[0] - b[0]
dy = a[1] - b[1]
return dx * dx + dy * dy < (a[2] + b[2]) * (a[2] + b[2])Un ejemplo con números: dos círculos
| Círculo A | Círculo B | dx y dy | Cuadrado de la distancia | Cuadrado de la suma de radios |
|---|---|---|---|---|
| centro 0, 0, radio 5 | centro 6, 8, radio 5 | 6 y 8 | 36 + 64 = 100 | 10 por 10 = 100: se tocan, no se solapan |
| centro 0, 0, radio 5 | centro 3, 4, radio 5 | 3 y 4 | 9 + 16 = 25 | 100: se solapan |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Un error frecuente
Advertencia
Mucha gente prueba solo un eje y concluye que hay colisión. Dos cajas pueden estar en la misma columna y muy lejos una de otra en vertical. Hacen falta las cuatro comparaciones, y basta con que falle una para que no haya colisión.