↓
iaen.es Diario de desarrollo Read in English

Gotic · 3 min de lectura

Carrera a pie contrarreloj en Godot: seis puertas, tres medallas y un bot que la corre con física

La carrera de las postas: seis puertas en el prado del oeste, 65 segundos de límite y el oro en 38. Un piloto automático con física real la termina en 40,73 s.

#carreras#minijuegos#mods#pruebas

Carrera a pie contrarreloj en Godot: seis puertas, tres medallas y un bot que la corre con física

Junto a Brumacosta hay un cartel turquesa: CARRERA DE LAS POSTAS. Si le hablas, te deja en la salida, cuenta tres segundos y suelta un «¡YA! Cruza las puertas en orden». Por el prado del oeste hay seis puertas de madera con banderines, unidas por un sendero, y un aro dorado señala la siguiente. Tienes 65 segundos. El oro está en 38, la plata en 49, y terminar ya da el bronce. Tu mejor marca se guarda.

La carrera es a pie: si sacas la escoba, el intento se cancela. Las infusiones de Lía sí valen, y el reloj se para si abres un menú. En la captura acaba de sonar la salida: el aro brilla en la puerta 1, la META queda a tu espalda y a la derecha asoma el molino de Brumacosta.

Cómo está hecho

La parte interesante es decidir cuándo has cruzado una puerta. Lo más sencillo sería mirar si el jugador está a menos de 3,2 m de ella en un fotograma, pero corriendo, entre dos fotogramas, podrías pasar de largo sin que ningún fotograma te pille dentro. Así que la carrera guarda dónde estabas en el fotograma anterior y mira el segmento entre las dos posiciones:

var target: Vector3 = gates[checkpoint].global_position
var closest := Geometry3D.get_closest_point_to_segment(target, _previous, p)
# El segmento no puede saltarse medio circuito: protege también frente a teletransportes.
if p.distance_to(_previous) <= 12.0 and closest.distance_to(target) < CHECK_RADIUS and p.y - Island.height_at(p.x, p.z) < 2.0:

Tres condiciones:

  1. el segmento pasa a menos de 3,2 m del centro de la puerta;
  2. el segmento mide 12 m o menos, para que un teletransporte no cuente como haber recorrido medio circuito;
  3. estás a menos de 2 m del suelo, para que no cuente pasar por encima volando o de un salto enorme.

Además, solo cuenta la puerta que toca: cruzar otra fuera de orden no hace nada. Salirse más de 4 m durante la cuenta atrás es salida anticipada. Al cargar la partida, el récord se recorta entre 0 y 65 s, y una prueba carga a propósito un récord que es una cadena para comprobar que no rompe nada.

Lo que salió mal

  • Las pruebas no eran modulares. Para comprobar que «volar cancela el intento», la prueba de la carrera usaba la escoba de verdad. Si quitabas la carpeta de la escoba, el juego seguía funcionando pero tests/run.sh fallaba. Ahora la prueba monta al jugador en un mover de mentira que lo deja flotando, y la prueba ya no necesita la escoba: a la carrera le basta con saber que el jugador va montado en algo.
  • Mirar solo las puertas no basta. Es la misma lección que me dejó la aldea, cuya primera ubicación quedó medio bajo el agua: la costa procedural tiene ensenadas. Por eso la prueba de la carrera muestrea todo el recorrido, 21 puntos entre cada par de puertas, todos en tierra y con pendiente menor de 0,25.

Lo que falta por comprobar

Una prueba pilota al personaje con física real por las seis puertas, sin teletransportes ni bonificaciones, siempre en línea recta hacia la siguiente: 40,73 s. Es decir, el bot se queda en plata, a menos de 3 s del oro. Pero un bot que corre en línea recta no es un jugador. No sé si los 38 s del oro son un reto justo, ni cómo se hace la carrera con el joystick táctil. Los FPS en el móvil también están sin medir. Esta captura costó 427 llamadas de dibujo en el PC.

Más de Gotic →