Conectando todos los nodos

Resumen

Conectar nodos con señales en Godot permite que un evento, como un gol en Pong, dispare una función que reinicia la pelota a su posición inicial. Aquí aprendes a refactorizar tu script, crear una función de reset y enlazar áreas de colisión a la lógica del nivel, ideal si estás dando tus primeros pasos con GDScript.

Por qué conviene refactorizar la lógica de la pelota antes de conectar señales

Antes de tocar las señales, necesitas que la lógica de lanzamiento de la pelota viva en una función reutilizable. Esto te ahorra duplicar código cuando quieras volver a lanzarla tras cada gol.

En el script ball, todo lo que estaba dentro de _ready se mueve a una nueva función llamada reset_ball. Fíjate en un detalle: el nombre va sin guion bajo al inicio porque la vas a invocar desde otro script, no solo de forma interna. Luego, dentro de _ready simplemente llamas a reset_ball() para mantener el comportamiento original al iniciar el juego [1:05].

¿Qué significa el guion bajo al inicio de una función en GDScript? Indica por convención que la función es privada o de uso interno. Si planeas llamarla desde otro nodo, omítelo para señalar que es parte de la API pública del script.

Cómo crear la función restart_game en el nodo raíz del nivel

El reinicio del juego es responsabilidad del nodo raíz, no de la pelota. Por eso adjuntas un nuevo script al nodo level y ahí defines _restart_game, esta vez sí con guion bajo porque solo se usa internamente [2:20].

La función necesita hacer cuatro cosas concretas:

  • Detener el movimiento de la pelota poniendo is_moving en false.
  • Resetear la dirección con Vector2.ZERO, que equivale a un vector con cero en X y cero en Y.
  • Reposicionar la pelota en el centro de la pantalla con Vector2(960, 540), resultado de dividir 1920 y 1080 entre dos.
  • Volver a llamar a reset_ball() para reactivar la velocidad en 600, generar una dirección random y poner la pelota en movimiento.

Cómo accedo a un nodo hijo desde el script padre en Godot

Cuando trabajas desde level y quieres tocar a ball, que es su hijo, puedes referenciarlo con el signo $ seguido del nombre del nodo. Así, $Ball.is_moving = false modifica directamente la propiedad de ese hijo sin necesidad de buscarlo con rutas largas.

Esta sintaxis te abre la puerta a leer y escribir tanto las variables que tú definiste como las propiedades que vienen por defecto en cualquier nodo, como position [3:40].

¿Qué es Vector2.ZERO en Godot? Es una constante que representa el vector (0, 0). La usas para detener movimiento, reiniciar direcciones o cualquier caso donde necesites un vector neutro sin escribir el valor manualmente.

Qué son las señales en Godot y cómo conectarlas a una función

Las señales son el sistema de eventos de Godot: un nodo emite un aviso cuando algo ocurre y otros nodos pueden escucharlo para reaccionar. En este caso, los arcos son nodos Area2D, que disponen de la señal body_entered, disparada cuando un cuerpo físico entra en su zona de colisión [5:10].

El flujo para conectarla es directo:

  1. Selecciona el arco del player en el editor.
  2. Abre el panel de nodos y ve a la pestaña de señales.
  3. Haz doble clic en body_entered y elige el script de level como destino.
  4. Godot genera automáticamente una función que recibe el body que entró y ahí ejecutas _restart_game().

Repites el mismo proceso con el arco del oponente. Ahora cada vez que la pelota cruza cualquiera de los dos arcos, se dispara la señal, se ejecuta el reset y la pelota vuelve al centro lista para un nuevo lanzamiento.

Cómo verifico que la conexión entre nodos funciona

Al correr el juego deberías ver el ciclo completo: la pelota sale del centro, se mueve en una dirección aleatoria, atraviesa un arco y vuelve a aparecer en el medio con un nuevo lanzamiento [7:15]. Si no se reinicia, revisa que la señal esté conectada al script correcto y que la función generada llame a _restart_game.

Con esto ya tienes los arcos hablando con la pelota, el control del personaje funcionando y la IA del oponente activa. Solo falta sumar el marcador para contar los goles. ¿Te animas a implementarlo antes de la próxima clase y compartir tu solución en los comentarios?