BLOG
Primeros pasos con Godot 4: escenas, nodos y señales.
Godot es un motor de código abierto muy usado en el desarrollo independiente. Antes de escribir una línea conviene entender tres ideas: nodos, escenas y señales.
Nodos y escenas
En Godot todo es un nodo: un sprite, una colisión, un botón, un temporizador. Cada nodo hace una cosa. Los nodos se organizan en árbol, con uno padre y varios hijos.
Un árbol de nodos guardado en un archivo es una escena. Un jugador puede ser una escena, igual que un enemigo, una sala o un menú. Las escenas se pueden instanciar dentro de otras, y esa es la forma natural de construir un juego por piezas.
Un personaje que se mueve
Crea una escena nueva con un nodo CharacterBody2D como raíz. Añade como hijos un Sprite2D con una imagen y un CollisionShape2D con una forma. Después adjunta un script al nodo raíz:
extends CharacterBody2D
@export var velocidad := 220.0
func _physics_process(_delta: float) -> void:
var direccion := Input.get_vector("izquierda", "derecha", "arriba", "abajo")
velocity = direccion * velocidad
move_and_slide()
Tres detalles del código:
@exportmuestra la variable en el Inspector, para que puedas cambiarla sin tocar el script._physics_processse ejecuta a intervalos fijos y es el lugar adecuado para el movimiento con física.Input.get_vectordevuelve un vector ya normalizado a partir de cuatro acciones.
Las acciones izquierda, derecha, arriba y abajo se definen en Proyecto → Ajustes del proyecto → Mapa de entrada. Si no existen, el código no encontrará nada que leer.
Señales: cómo se hablan los nodos
Una señal es un aviso que un nodo emite cuando ocurre algo: un botón se pulsa, un temporizador termina, dos cuerpos chocan. Otros nodos pueden suscribirse y reaccionar sin que el emisor sepa quiénes son.
Por ejemplo, para que un botón llamado Boton inicie la partida:
func _ready() -> void:
$Boton.pressed.connect(_al_pulsar_boton)
func _al_pulsar_boton() -> void:
get_tree().change_scene_to_file("res://escenas/partida.tscn")
También puedes definir tus propias señales con signal y emitirlas con emit(). Es la mejor forma de evitar que un nodo dependa directamente de otro: la interfaz escucha la señal «vida_cambiada» del jugador, pero el jugador no necesita saber que existe una interfaz.
Organización recomendada
- Una carpeta por tipo de contenido:
escenas,scripts,arte,audio. - Una escena por entidad y un script por escena, salvo que compartan lógica.
- Nombres claros:
jugador.tscnes mejor queescena1.tscn. - Control de versiones desde el primer día. Git funciona bien con Godot porque las escenas son texto.
Siguientes pasos
Con estos conceptos puedes construir un prototipo pequeño: un personaje, una sala y un enemigo que persigue. Cuando eso funcione, añade una forma de ganar o perder. La documentación oficial de Godot tiene un tutorial de juego 2D completo que puedes seguir paso a paso, y es el mejor siguiente paso.
Si trabajas en solitario, te será útil el artículo sobre cómo acotar el alcance de un proyecto indie.
Grupos, recursos y autoload
Cuando el proyecto crece aparecen tres herramientas que conviene conocer:
- Grupos. Permiten etiquetar nodos, por ejemplo «enemigos», y actuar sobre todos a la vez con
get_tree().call_group("enemigos", "congelar"). - Recursos. Son archivos de datos que puedes editar en el Inspector. Sirven para definir objetos, enemigos o mejoras sin escribir cada uno como escena. Un roguelite se beneficia mucho de esto: cada mejora puede ser un recurso con nombre, descripción y efecto.
- Autoload. Un script que se carga siempre, útil para datos globales como el progreso guardado o la configuración de audio. Úsalo con moderación: demasiados estados globales complican la depuración.
Probar en el móvil
Si piensas lanzar en móviles, prueba en un dispositivo real cuanto antes. Godot permite exportar a Android y ejecutar el proyecto en un teléfono conectado. Algunas cosas solo se ven en el dispositivo: el tamaño real de los botones, el rendimiento, el comportamiento al recibir una llamada o al cambiar de aplicación.
Godot 4 ofrece distintos renderizadores. Para móviles y equipos modestos suele convenir el modo de compatibilidad o el móvil, que son más ligeros que el de Forward+. Consulta la documentación oficial del motor para elegir el adecuado para tu proyecto.
Errores típicos de quien empieza
- Escribir todo en un solo script gigante en lugar de repartir la lógica entre escenas.
- Mover nodos con
positiondentro de un cuerpo físico en lugar de usarvelocityymove_and_slide(). - No usar
@exporty tener que abrir el código para cada ajuste. - No guardar el proyecto en control de versiones hasta que algo se rompe.