¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Detectar colisiones en un juego

Después de esta lección: Puedo detectar una colisión entre dos rectángulos o entre dos círculos y decir si se tocan.

Lección de 65 min2 comandosLaboratorio de desarrollo de juegos: bucle de juego, gravedad y colisiones en el navegador

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

PalabraQué significaEjemplo
Colisióndos objetos del juego que se tocan o se solapan
Rectángulouna caja con posición x, y, ancho y altox, y, w, h
Solaparcompartir una parte del espacio, no solo un borde
Círculouna forma con un centro y un radiox, y, r
Distancialo lejos que están dos centrosdx, 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

Código: web
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 ACaja BLas cuatro comparacionesResultado
x 0, y 0, 10 por 10x 5, y 5, 10 por 100 < 15, 10 > 5, 0 < 15, 10 > 5: todas ciertasSe solapan
x 0, y 0, 10 por 10x 20, y 0, 10 por 100 < 30 cierta, 10 > 20 falsaNo se solapan
x 0, y 0, 10 por 10x 10, y 0, 10 por 100 < 20 cierta, 10 > 10 falsaNo: 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

Comando
docker exec jupyter python3 steps/collide.py

Se 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

Comando
docker exec jupyter grep -n "overlaps" game/game.js

Se 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

Código: 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 ACírculo Bdx y dyCuadrado de la distanciaCuadrado de la suma de radios
centro 0, 0, radio 5centro 6, 8, radio 56 y 836 + 64 = 10010 por 10 = 100: se tocan, no se solapan
centro 0, 0, radio 5centro 3, 4, radio 53 y 49 + 16 = 25100: 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.

Sobre este laboratorio y su código: Laboratorio de desarrollo de juegos: bucle de juego, gravedad y colisiones en el navegador

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.