Cómo implementar un ciclo día-noche en Godot

Un ciclo día-noche puede agregar un elemento inmersivo a tus juegos, agregar variedad a las imágenes y crear mecánicas interesantes. Juegos como Minecraft, Animal Crossing y Don’t Starve utilizan esta técnica de manera efectiva, y es una que podrías considerar agregar a tus propios juegos, particularmente aquellos con un elemento en tiempo real.

Afortunadamente, en Godot 4 lograr un ciclo día-noche es más fácil que nunca.

Configurando el juego de Godot

Antes de sumergirte en la implementación del ciclo día-noche, establece las bases de tu juego. Comience creando un nuevo proyecto 2D en Godot 4. Configure su proyecto con la configuración necesaria.

El código utilizado en este artículo está disponible en este repositorio de GitHub y su uso es gratuito bajo la licencia MIT.

Ahora, crea un personaje jugador. En tu escena, agrega un CharacterBody2D. Dentro de él, agregue un CollisionShape2D con forma de rectángulo y un Sprite2D. Esto representará visualmente a tu personaje.

Para permitir que el reproductor se mueva, puede utilizar el siguiente código GDScript. Adjunte este script a su nodo de personaje:

 extends CharacterBody2D

var speed = 300

func _physics_process(delta):
    var input_dir = Vector2.ZERO

    if Input.is_action_pressed("ui_left"):
        input_dir.x -= 1

    if Input.is_action_pressed("ui_right"):
        input_dir.x += 1

    if Input.is_action_pressed("ui_up"):
        input_dir.y -= 1

    if Input.is_action_pressed("ui_down"):
        input_dir.y += 1

    velocity = input_dir.normalized() * speed
    move_and_collide(velocity * delta)

Este código permitirá al jugador moverse hacia la izquierda, derecha, arriba y abajo usando las teclas de flecha. También puedes agregar algunos enemigos para que tu jugador los esquive. Utilice nodos StaticBody2D para estos enemigos y ajuste sus formas y posiciones en consecuencia.

Agregue un temporizador para el ciclo diurno y nocturno

Para crear un ciclo día-noche, necesita un temporizador que funcione continuamente, alternando entre las fases diurna y nocturna. Este cronómetro será el responsable de seguir el paso del tiempo en tu juego.

Agrega un nodo Temporizador a tu escena Godot. Puede hacer esto haciendo clic derecho en el panel Escena, eligiendo Agregar nodo y luego buscando Temporizador en la biblioteca de nodos.

Cambie el nombre del nodo Temporizador a algo significativo como DayNightTimer para mayor claridad. Configure las propiedades del nodo Temporizador en el panel Inspector. Específicamente, establezca la propiedad Tiempo de espera en 0 (este es el retraso inicial antes de que comience el temporizador) y verifique la propiedad One Shot para que el temporizador se repita.

Ahora, agregue un código GDScript que administre el ciclo día-noche:

 extends Node2D

var day_duration = 30
var night_duration = 30

var is_day = true

func _ready():
    
    $DayNightTimer.start()

func _on_DayNightTimer_timeout():
    if is_day:
        
        $DayNightTimer.start(day_duration)
        is_day = false

        
    else:
        
        $DayNightTimer.start(night_duration)
        is_day = true

        

En la función _ready, inicie DayNightTimer cuando se cargue la escena para iniciar el ciclo día-noche. La función _on_DayNightTimer_timeout se ejecutará cada vez que el temporizador llegue a cero, que es cuando llega el momento de realizar la transición entre el día y la noche.

Si sigue estos pasos, tendrá un temporizador funcional de día y noche que realiza una transición entre el día y la noche, lo que le permitirá agregar elementos de juego dinámicos y cambios visuales a su juego de Godot según la hora del día.

Adaptación del fondo para el día y la noche

Para complementar su ciclo día-noche, necesita una forma de representar visualmente las transiciones entre el día y la noche. Puede utilizar un nodo ColorRect integrado para crear un fondo adecuado tanto para el día como para la noche. Este enfoque permite transiciones más suaves y un mayor control sobre las imágenes.

En tu escena Godot, agrega un nodo ColorRect. Este nodo servirá como fondo que cambia de color para representar el día y la noche. Cambie el nombre del nodo ColorRect a algo significativo como BackgroundRect. Colóquelo como capa de fondo, asegurándose de que cubra toda la ventana gráfica.

En el panel Inspector, establezca la propiedad Color en su color de fondo inicial, que debería representar el día. Por ejemplo, puede utilizar Color(0,5, 0,5, 0,8) para un cielo diurno azul claro.

Ahora, actualice su código GDScript para que funcione con el nodo ColorRect:

 func _on_day_night_timer_timeout():
    if is_day:
        
        $DayNightTimer.start(day_duration)
        is_day = false

        

        
        $BackgroundRect.color = Color(0.5, 0.5, 0.8)
    else:
        
        $DayNightTimer.start(night_duration)
        is_day = true

        

        
        $BackgroundRect.color = Color(0, 0, 0)

Actualice el color del nodo BackgroundRect para reflejar la hora del día. Por ejemplo, configúrelo en negro cuando pase a la noche, creando un fondo oscuro. Al pasar al día, configúrelo en azul claro.

Efectos de sonido para el ciclo día-noche

Los efectos de sonido pueden desempeñar un papel crucial a la hora de mejorar la inmersión y el realismo de tu ciclo día-noche en Godot. Proporcionan señales auditivas a los jugadores, haciendo que la transición entre el día y la noche sea más cautivadora. Puedes agregar fácilmente efectos de sonido a tu juego de Godot.

Antes de comenzar, asegúrese de tener recursos de audio (archivos de sonido) que representen sonidos diurnos y nocturnos. Por ejemplo, es posible que tengas el canto de los pájaros durante el día y los grillos o los ululares de los búhos durante la noche.

En su escena Godot, agregue dos nodos AudioStreamPlayer2D y asígneles el nombre apropiado. Puedes nombrarlos como $DaytimeSounds y $NighttimeSounds.

Ahora, actualice el código GDScript para gestionar las transiciones de sonido entre el día y la noche:

 func _on_day_night_timer_timeout():
    if is_day:
        
        $DayNightTimer.start(day_duration)
        is_day = false
     
        
        $NighttimeSounds.stop()
        $DaytimeSounds.play()
         
    else:
        
        $DayNightTimer.start(night_duration)
        is_day = true

        
        $DaytimeSounds.stop()
        $NighttimeSounds.play()

Cuando el temporizador día-noche expira, este código verifica a qué fase debe pasar y reproduce los sonidos apropiados para que coincidan.

Siéntete libre de personalizar tus efectos de sonido libres de derechos de autor para que coincidan con el tema y la atmósfera de tu juego. También puedes superponer varias pistas de audio o utilizar efectos de audio (reverberación, eco, etc.) para crear una experiencia auditiva más rica.

Haz que tus juegos de Godot sean más atractivos con un ciclo día-noche

Implementar un ciclo día-noche en tu juego de Godot puede mejorar significativamente la inmersión y el compromiso del jugador. Agrega profundidad al mundo de tu juego, introduce elementos de juego dinámicos y permite una narración creativa.

Recuerda adaptar el ciclo día-noche al tema y la mecánica únicos de tu juego, y no dudes en experimentar con diferentes efectos visuales y de juego para crear una experiencia de juego verdaderamente cautivadora.