↓
iaen.es Diario de desarrollo Read in English

Gotic · 3 min de lectura

Ciclo de día y noche en Godot 4 con una sola luz y noches más cortas

Un día de 16 minutos con atardeceres naranjas, luna, estrellas y pueblos con las ventanas encendidas. Una sola luz hace de sol y de luna, y la noche pasa más deprisa a propósito.

#shaders#mundo#godot#mods#móvil

Ciclo de día y noche en Godot 4 con una sola luz y noches más cortas

Hasta este mod, en Gotic siempre eran las ocho de la mañana. Con Día y noche el sol sale por el este, cruza el cielo por el sur y se pone por el oeste; el atardecer tiñe la isla de naranja (como en la portada, sobre Brumacosta a las 19:22) y de noche salen la luna y las estrellas. Arriba en el centro, un reloj pequeño dice el día y la hora.

Los pueblos se enteran: de noche encienden ventanas y faroles, la hoguera se aviva y los vecinos que paseaban se sientan junto al fuego.

Brumacosta de noche, con las ventanas encendidas
Brumacosta a las 21:35: ventanas y faroles encendidos

Cómo está hecho

Un día entero dura 16 minutos de juego: 11 de luz (de 5:00 a 20:00) y 5 para el resto. La noche pasa más deprisa a propósito; la hora avanza a un ritmo u otro según el tramo:

static func rate(at: float) -> float:
	if at >= LIGHT_FROM and at < LIGHT_TO:
		return (LIGHT_TO - LIGHT_FROM) / DAYLIGHT_SECONDS
	return (24.0 - LIGHT_TO + LIGHT_FROM) / (DAY_SECONDS - DAYLIGHT_SECONDS)

Para no saltarse un cambio de ritmo ni el cambio de día con un paso largo, el avance se parte en trozos que acaban justo en cada borde (5:00, 6:00, 20:00 y medianoche). El contador de días sube al amanecer, a las 6. Una prueba mide que de amanecer a amanecer pasan 960 ± 1 s.

El cielo lo pinta Scenery.apply_time(hora), y aquí está lo que más me interesaba: una sola luz direccional hace de sol y de luna. De día es el sol, blanco a mediodía y anaranjado cerca del horizonte; a las 20:00, cuando el sol se pone, esa misma luz pasa a ser la luna, azulada y con mucha menos energía. En el cambio, la luz está en el horizonte y con energía casi cero, así que no se nota el salto. Los colores del cielo, del horizonte, de la luz ambiente y del mar salen de una paleta por horas (amanecer, día, atardecer, noche) que se interpola suavemente.

Las estrellas son una cúpula a 700 m del jugador: más allá del terreno (440 m) y dentro del alcance de la cámara (900 m). Es un solo dibujo y solo existe de noche.

Dos decisiones pensando en el móvil:

  • La noche es azul y legible, no negra. En una pantalla de móvil, una noche negra no se juega.
  • Las luces de los pueblos no son luces. Ventanas y faroles son una malla con un material que brilla. En el renderer Compatibility, cada luz del motor es otra pasada por objeto, y con cuatro pueblos eso se notaría.

El cielo no se repinta en cada fotograma, sino cada medio segundo: a esa velocidad no se ve la diferencia. Y otros mods leen world.scenery.night (0 de día, 1 de noche) sin conocer este: la fauna cambia mariposas por luciérnagas, el sonido ambiente cambia pájaros por grillos y la fiesta de Brumacosta solo existe porque hay noches. Apagar el mod deja el cielo de siempre.

La isla entera de noche, con las estrellas
Toda la isla a las 23:05: azul oscuro, pero se lee

Lo que salió mal

El mod en sí no dio guerra, pero la noche destapó fallos en los que llegaron después: seis estilos del estudio de filtros se quedaban en negro (usaban umbrales fijos y hubo que añadirles exposición automática), y con el mod del tiempo las gotas de lluvia brillaban de noche y se veían estrellas detrás de las nubes.

Medido en el PC aquella ronda: 752 comprobaciones correctas, y capturas de día, atardecer y noche a 1280×720 y 1600×720.

Lo que falta por comprobar

Los FPS de noche en el móvil. Cuando por fin se midió el juego en un Samsung S24 Ultra, fue a 60 FPS de día, a pie y volando; de noche, sin medir. Aquella ronda tampoco se pudo exportar el APK, por un problema del entorno de exportación y no del código.

Más de Gotic →