El proyecto que acompaña a la Parte 1 (clases 026–045) y a su capstone (clase 045).
Un plataformas 2D completo y jugable en Godot 4:
user://save.json (clase 043).Controles: A/D o ←/→ para moverte · Espacio/W para saltar · R para reiniciar.
plataformas-2d/
├── inicio/ ← empieza aquí: completa los TODO
│ ├── project.godot
│ ├── assets/ (sprites y sonidos CC0)
│ ├── escenas/ (mundo, jugador, moneda, enemigo, HUD)
│ └── scripts/ (jugador.gd, moneda.gd y enemigo.gd con TODO)
└── solucion/ ← referencia completa y jugable
Lo que ya viene resuelto en inicio/ (para que te centres en el gameplay): la generación del nivel, el HUD, el estado global, las escenas, el Input Map, las capas de colisión y los assets.
labs/plataformas-2d/inicio/project.godot → F5.scripts/jugador.gd y completa los TODO en orden. Ejecuta tras cada uno.| TODO | Qué consigues | Clase |
|---|---|---|
| 1 | El personaje cae (gravedad) | 007, 030 |
| 2 | Se mueve con aceleración y fricción | 030 |
| 3–4 | Coyote time y jump buffer | 030 |
| 5–6 | Salto y salto variable | 030 |
| 7 | Animaciones según el estado | 031, 036 |
Luego sigue con moneda.gd (clase 039) y enemigo.gd (clases 037–038).
¿Atascado? Abre el archivo equivalente en
solucion/scripts/y compara. No es hacer trampa: leer código bueno es parte de aprender.
El nivel se genera desde un mapa ASCII que está en scripts/mundo.gd (constante NIVEL). Edítalo y verás el cambio al instante:
'#' suelo 'S' piedra '=' plataforma 'o' moneda
'e' enemigo 'P' inicio 'F' meta '.' vacío
La clase 035 enseña el flujo real con TileMapLayer en el editor. Aquí usamos texto para que el nivel sea legible y editable en un diff — el resultado en pantalla es equivalente, y diseñar niveles retocando el mapa es rapidísimo.
AnimatableBody2D con un Tween (clase 034).get_tree().paused (clase 040)..exe y un build web y publícalo en itch.io (clase 044).Este proyecto se comprueba automáticamente en CI con Godot headless: se regeneran los assets (y se valida que el generador es determinista), se importa el proyecto y se arranca durante 120 frames buscando errores de script o de carga. Puedes hacer lo mismo en local:
godot --headless --path labs/plataformas-2d/solucion --import
godot --headless --path labs/plataformas-2d/solucion --quit-after 120