↓
iaen.es Diario de desarrollo Read in English

Gotic · 4 min de lectura

Una contrarreloj de aros en el cielo en Godot 4 y cómo saber si los cruzas

Diez aros en el aire, una escoba y un reloj. Cómo detecto que pasas por dentro y en el sentido correcto, por qué los aros son opacos y de dónde salen las medallas.

#carreras#minijuegos#mods#godot#fallos

Una contrarreloj de aros en el cielo en Godot 4 y cómo saber si los cruzas

La escoba era lo que más gustaba del juego y faltaba algo que hacer con ella. Así nacieron los Aros del cielo: junto a la playa de salida hay un cartel; hablas con él llevando la escoba, despegas y se enciende el aro de SALIDA. El reloj arranca al cruzarlo y se para en la META, diez aros después, tras una vuelta por encima de Brumacosta y de regreso por la costa. Hay que pasarlos en orden y por dentro, y si aterrizas o te bajas de la escoba, el intento se acaba.

El aro que toca se pinta dorado, el siguiente blanco y los ya cruzados desaparecen. Oro en 80 s, plata en 95 y límite de 120. El récord se guarda y, con el primer oro, la escoba empieza a dejar una estela dorada, la que se ve en la portada.

Cómo está hecho

El problema interesante es decidir si has cruzado un aro. Estar cerca de su centro no basta: hay que atravesarlo, por dentro y en el sentido del recorrido, para que no valga entrar y salir por el mismo lado ni pasar rozando por fuera. Así que cada paso de física es un segmento entre la posición anterior y la actual, y miro si ese segmento atraviesa el plano del aro, de delante hacia detrás, y a menos de 5 m de su centro:

static func crosses(i: int, a: Vector3, b: Vector3) -> bool:
	var center: Vector3 = RINGS[i]
	var axis := direction(i)
	var da := (a - center).dot(axis)
	var db := (b - center).dot(axis)
	if da > 0.0 or db < 0.0 or is_equal_approx(da, db):
		return false   # solo de delante hacia detrás, en el sentido del recorrido
	var hit := a.lerp(b, -da / (db - da))
	return hit.distance_to(center) < RADIUS

La dirección de cada aro es la media entre la recta que llega del anterior y la que sale hacia el siguiente, y cada aro se orienta con ella, así que se cruza de frente aunque el recorrido gire. Un salto de más de 12 m en un paso no cuenta, para que un teletransporte no se cuele como una pasada.

Las posiciones de los aros son constantes. Las alturas las medí fuera del juego sobre el relieve: cada aro entero y la recta hasta el siguiente quedan por encima del suelo, del mar y de las copas de los árboles (14 m sobre el suelo donde hay bosque), y una prueba lo comprueba.

Las medallas no salen de mi intuición. Una prueba pilota la escoba con su física real, girando la cámara como haría un jugador, y da la vuelta completa (unos 950 m) en 64,6 s. A partir de ahí puse el oro en 80 s. Este mod lo hizo una de las dos sesiones de Claude que trabajaron a la vez aquella ronda, cada una con sus mods y su copia del proyecto.

Lo que salió mal

  • El mar se comía los aros. La primera versión era transparente. El mar también lo es, se pinta después y tapaba la mitad de abajo de un aro que estaba 3 m por encima del agua. Ahora son opacos: lo que tenga que verse sobre el agua no puede ser transparente.
  • Una bola negra detrás de la escoba. La estela usaba partículas de cara a la cámara (BILLBOARD_PARTICLES). En el renderer Compatibility, las que aún no habían salido se dibujaban todas juntas en el emisor, con el color a cero. Lo vi aislándolo en una escena aparte. Ahora la estela son esferitas sin billboard.
  • Una prueba que no probaba nada. Hice que el reloj corriera con el menú abierto, para ver si alguna prueba fallaba, y no falló ninguna: la prueba miraba antes de cruzar la SALIDA, cuando el reloj aún no corría. Ahora mira en plena vuelta.

En total son 21 comprobaciones (19 s, casi todo la vuelta con física). La captura de la portada costó 447 llamadas de dibujo; sobre Brumacosta, a 1600×720, llegó a 583.

Lo que falta por comprobar

No se ha jugado en el móvil: ni los FPS, ni pilotar entre aros con los dedos. Los tiempos de las medallas salen de un piloto automático, no de jugadores. Y el sonido de cada aro (un soplo de aire y dos notas de campana que suben de tono con cada aro) se genera por código y no satura, pero no lo he escuchado.

Más de Gotic →