🎮 Diagrama de Conceptos: Godot 2D
Guía visual completa para dominar el desarrollo 2D en Godot 4
Fundamentos
-
Sistema de Nodos y Escenas
Concepto fundamental: Todo en Godot es un nodo. Las escenas son colecciones de nodos organizados jerárquicamente.
Ejemplo: Player → CharacterBody2D → Sprite2D + CollisionShape2D -
Sistema de Coordenadas 2D
Importante: En Godot 2D, Y aumenta hacia abajo. Origen (0,0) en esquina superior izquierda.
Unidades: 1 unidad = 1 píxel por defecto -
Viewport y Cámaras
Viewport: Área de renderizado del juego
Camera2D: Define qué parte del mundo se muestra. Incluye seguimiento, límites y efectos. -
Resources y Assets
Resources: Datos reutilizables (texturas, audio, scripts)
Importación: Godot importa automáticamente assets al FileSystem dock
Nodos 2D Principales
-
Node2D (Base)
Propiedades: position, rotation, scale
Uso: Contenedor básico para organizar otros nodos 2D -
Sprite2D
Función: Mostrar texturas estáticas
Propiedades clave: texture, offset, flip_h, flip_v, region -
AnimatedSprite2D
Función: Animaciones frame-by-frame
Requiere: SpriteFrames resource con animaciones configuradas -
CharacterBody2D
Para: Personajes controlables (player, NPCs)
Ejemplo de movimiento básico:extends CharacterBody2D const SPEED = 300.0 const JUMP_VELOCITY = -400.0 # Get the gravity from the project settings to be synced with RigidBody nodes. var gravity = ProjectSettings.get_setting("physics/2d/default_gravity") func _physics_process(delta): # Add gravity if not is_on_floor(): velocity.y += gravity * delta # Handle jump if Input.is_action_just_pressed("ui_accept") and is_on_floor(): velocity.y = JUMP_VELOCITY # Get input direction var direction = Input.get_axis("ui_left", "ui_right") if direction: velocity.x = direction * SPEED else: velocity.x = move_toward(velocity.x, 0, SPEED) move_and_slide()
-
RigidBody2D
Para: Objetos con física realista
Modos: Dynamic, Static, Kinematic, Character -
StaticBody2D
Para: Plataformas, paredes, objetos estáticos
Características: No se mueve, solo detecta colisiones
Colisiones y Física
-
CollisionShape2D
Función: Define el área de colisión
Formas: Rectangle, Circle, Capsule, Polygon, etc. -
Area2D
Para: Detectar presencia sin colisión física
Usos: Triggers, zonas de daño, pickups, sensores -
Layers y Masks
Layer: En qué capa está el objeto
Mask: Con qué capas puede colisionar -
RayCast2D
Función: Detecta objetos en una línea recta
Usos: Visión de enemigos, detección de suelo, line of sight -
Physics Queries
PhysicsDirectSpaceState2D: Consultas manuales al motor de física
Métodos: intersect_ray(), intersect_shape(), etc.
Input y Controles
-
Input Map
Configuración: Project Settings > Input Map
Función: Mapea teclas/botones a acciones personalizadas -
Métodos de Input
Input.is_action_pressed(): Mantener presionado
Input.is_action_just_pressed(): Presionar una vez -
Input Events
_input(): Eventos globales de input
_gui_input(): Input para nodos de UI -
Mouse/Touch Input
get_global_mouse_position(): Posición del mouse en el mundo
TouchScreen: Soporte automático para dispositivos móviles
Animación
-
AnimationPlayer
Función: Anima cualquier propiedad de nodos
Características: Keyframes, curvas, loops, blend modes -
AnimationTree
Para: Animaciones complejas con transiciones
Nodos: StateMachine, Blend2D, OneShot, etc. -
Tween
Función: Interpolación por código
Ejemplos de uso:# Mover un objeto suavemente func move_to_position(target_pos: Vector2): var tween = create_tween() tween.tween_property(self, "position", target_pos, 1.0) # Fade in/out func fade_out(): var tween = create_tween() tween.tween_property(self, "modulate:a", 0.0, 0.5) # Escalar con bounce func scale_bounce(): var tween = create_tween() tween.set_trans(Tween.TRANS_BOUNCE) tween.tween_property(self, "scale", Vector2(1.5, 1.5), 0.3) tween.tween_property(self, "scale", Vector2.ONE, 0.3)
-
SpriteFrames
Resource: Contiene animaciones frame-by-frame
Usado por: AnimatedSprite2D
UI y HUD
-
CanvasLayer
Función: Separa UI del mundo del juego
Layer: Controla orden de renderizado (HUD encima del mundo) -
Control Nodes
Básicos: Label, Button, TextEdit, ProgressBar
Contenedores: VBoxContainer, HBoxContainer, GridContainer -
Anchors y Margins
Anchors: Puntos de referencia para posicionamiento responsive
Margins: Espaciado desde los anchors -
Themes
Resource: Estilo visual consistente para UI
Incluye: Fonts, colores, texturas, estilos
Audio
-
AudioStreamPlayer2D
Para: Audio posicional en el mundo 2D
Características: Atenuación por distancia, panning -
AudioStreamPlayer
Para: Audio global (música, UI sounds)
Sin posición: Se escucha igual en toda la pantalla -
Audio Bus
Función: Mezcla y efectos de audio
Efectos: Reverb, Chorus, Distortion, etc. -
Formatos de Audio
WAV: Sin compresión, mejor calidad
OGG: Comprimido, menor tamaño de archivo
Scripting
-
GDScript Básico
Sintaxis: Similar a Python, indentación importante
Ejemplo básico:# Ejemplo básico de GDScript extends Node2D # Variables var health: int = 100 var speed: float = 200.0 var player_name: String = "Player" # Función llamada al inicializar func _ready(): print("Jugador listo!") # Función llamada cada frame func _process(delta): if Input.is_action_pressed("ui_right"): position.x += speed * delta
-
Signals
Patrón Observer: Comunicación entre nodos
Ejemplo de implementación:# Declarar signal signal health_changed(new_health) signal player_died # Emitir signals func take_damage(amount: int): health -= amount health_changed.emit(health) if health <= 0: player_died.emit() # Conectar signals en _ready() func _ready(): health_changed.connect(_on_health_changed) player_died.connect(_on_player_died) func _on_health_changed(new_health: int): print("Salud actual: ", new_health) func _on_player_died(): print("Game Over!")
-
Métodos del Ciclo de Vida
_ready(): Al entrar en scene tree
_process(delta): Cada frame
_physics_process(delta): Cada frame de física -
Export Variables
@export: Variables editables en el inspector
Ejemplos de uso:extends CharacterBody2D # Variables básicas exportadas @export var speed: float = 100.0 @export var jump_height: int = 400 @export var player_name: String = "Player" # Exportar con rangos @export_range(0.0, 10.0) var damage_multiplier: float = 1.0 @export_range(1, 100, 1) var max_health: int = 100 # Exportar enums @export var difficulty: Difficulty = Difficulty.NORMAL enum Difficulty { EASY, NORMAL, HARD } # Exportar resources @export var weapon: WeaponResource @export var player_texture: Texture2D # Grupos en el inspector @export_group("Movement") @export var walk_speed: float = 200.0 @export var run_speed: float = 400.0
-
Autoload/Singletons
Función: Scripts globales disponibles en todo el proyecto
Usos: Game managers, persistent data, global functions
Patrones y Arquitectura
-
Scene Management
get_tree().change_scene_to_file(): Cambiar escenas
SceneTree: Gestión del árbol de nodos principal -
Composition over Inheritance
Filosofía Godot: Componer funcionalidad con nodos
Ejemplo: Health component, Movement component -
State Machine
Para: Estados del player (idle, walking, jumping)
Implementación básica:extends CharacterBody2D enum State { IDLE, WALKING, JUMPING, FALLING } var current_state = State.IDLE func _physics_process(delta): match current_state: State.IDLE: handle_idle_state() State.WALKING: handle_walking_state() State.JUMPING: handle_jumping_state() State.FALLING: handle_falling_state() func change_state(new_state: State): current_state = new_state print("Estado cambiado a: ", State.keys()[new_state]) func handle_idle_state(): if Input.get_axis("ui_left", "ui_right"): change_state(State.WALKING) elif Input.is_action_just_pressed("jump"): change_state(State.JUMPING)
-
Observer Pattern
Con Signals: Desacoplar sistemas
Ejemplo: player_died signal → update UI + save game
Optimización
-
Object Pooling
Para: Objetos que se crean/destruyen frecuentemente
Implementación básica:# Pool simple para balas class_name BulletPool extends Node var bullet_scene = preload("res://Bullet.tscn") var available_bullets: Array[Bullet] = [] var active_bullets: Array[Bullet] = [] func _ready(): # Pre-crear pool de balas for i in range(50): var bullet = bullet_scene.instantiate() bullet.visible = false add_child(bullet) available_bullets.append(bullet) func get_bullet() -> Bullet: if available_bullets.is_empty(): # Crear nueva si no hay disponibles var bullet = bullet_scene.instantiate() add_child(bullet) return bullet else: # Reutilizar existente var bullet = available_bullets.pop_back() active_bullets.append(bullet) return bullet func return_bullet(bullet: Bullet): bullet.visible = false active_bullets.erase(bullet) available_bullets.append(bullet)
-
Optimización de Texturas
Import settings: Compression, mipmaps, format
Tip: Usar atlas de texturas para reducir draw calls -
Culling y LOD
VisibilityNotifier2D: Detecta cuando objetos son visibles
LOD: Level of Detail para objetos distantes -
Profiling
Debugger: Profiler tab muestra performance
Métricas: FPS, memory, draw calls, nodes
Herramientas Avanzadas
-
TileMap
Para: Niveles basados en tiles (plataformas, RPGs)
TileSet: Resource con configuración de tiles -
Particles2D
Efectos: Fuego, humo, explosiones, lluvia
ProcessMaterial: Configuración de comportamiento -
Lighting 2D
Light2D: Fuentes de luz puntuales
LightOccluder2D: Objetos que proyectan sombras -
Shaders 2D
GLSL personalizado: Efectos visuales avanzados
Usos: Outline, glow, distortion, water effects
🎯 Ruta de Aprendizaje Recomendada
Fundamentos y Primeros Pasos
Domina el sistema de nodos, coordenadas 2D, y crea tu primera escena con Sprite2D y StaticBody2D
Movimiento y Input
Implementa CharacterBody2D con controles básicos, aprende Input Map y métodos de input
Colisiones y Física
Configura CollisionShape2D, entiende layers/masks, experimenta con Area2D para triggers
Animación Básica
Crea AnimatedSprite2D con múltiples animaciones, usa AnimationPlayer para propiedades
GDScript y Lógica
Domina el scripting básico, signals para comunicación, y export variables
UI y Audio
Construye HUD con CanvasLayer y Control nodes, añade efectos de sonido
Gestión de Escenas
Aprende scene management, autoloads para datos persistentes, y arquitectura modular
Conceptos Avanzados
Explora TileMap, particles, lighting 2D, optimización y patrones avanzados
💡 Tip: Practica cada concepto con pequeños proyectos antes de avanzar al siguiente nivel.