Bring it together into a small complete game — a game loop with win/lose, sound and juice, and then export a real build for desktop, mobile, or the web that other people can play.
A finished game is more than a character that moves — it has a full loop: a start, a goal, win and lose conditions, and a way to restart. Assembling your scenes into this loop (menu → play → win/lose → back to menu) is what turns a prototype into a game. Scoping a small but complete experience, rather than an endless prototype, is the single most important habit for actually finishing games.
A COMPLETE game (however small) has a full loop:
Main Menu --start--> Gameplay --win/lose--> Results --> Main Menu
|
goal + fail state + score + restart
Assemble the pieces you've built:
- Player scene (movement, input) [lessons 3-4]
- Enemy / Coin scenes (physics, signals) [lessons 4-5]
- HUD (score, health) [lesson 5]
- GameState autoload (score, level) [lesson 5]
- win condition (all coins) + lose (health 0) -> Results scene
FINISHING beats scope. A small, complete game > an endless prototype. Scope
tiny, ship it, then iterate."Juice" is the layer of feedback that makes a game satisfying: sound effects on every action, particles on impact, screen shake, a little squash-and-stretch on a jump, a hit-stop pause on a big hit. AudioStreamPlayer plays sounds, and small animated responses to player actions provide the feedback loop that makes controls feel alive. Juice is cheap to add and transforms how a game feels.
extends Node
@onready var jump_sfx := $JumpSound # an AudioStreamPlayer node
func on_jump() -> void:
jump_sfx.play() # sound feedback on every action
# + a squash/stretch tween, a puff of particles, a tiny screen shake...
# "juice" = feedback on every action:
# SFX on jump/hit/collect, particles on impact, screen shake, hit-stop,
# squash & stretch, number pop-ups. Cheap to add, huge feel improvement.
# players FEEL juice even if they can't name it. Add it late, tune by playtesting.To let others play, you export a build. Godot exports the same project to many platforms — Windows, macOS, Linux, Android, iOS, and the web (HTML5/WebAssembly) — after you install the matching export templates and configure a preset. Web export is especially powerful for sharing: a playable link with no install. Exporting is the step that turns your project into something real people can run.
# in Godot: Project > Export... > add a preset (Windows/macOS/Linux/Android/Web)
# install "export templates" once (Editor > Manage Export Templates).
# or from the command line (great for CI):
godot --headless --export-release "Windows Desktop" build/game.exe
godot --headless --export-release "Web" build/index.html
# WEB export -> HTML5 + WebAssembly: host the folder anywhere -> a playable
# LINK, no install. Ideal for sharing prototypes + game jams.
# desktop -> a native executable; mobile -> APK/IPA (needs signing, like the
# Android/iOS courses). One project, many platforms.You now have the full toolkit: math, physics, graphics, AI, and an engine to build in. The fastest way to improve is to finish small games — a game jam forces you to scope and ship in a weekend, teaching more than any tutorial. Beyond that, the courses in this roadmap deepen each pillar, and the broader software-engineering courses (version control, testing) make you a more effective developer as your projects grow.
You have the toolkit: math, physics, graphics, AI, and an engine. Next:
FINISH SMALL GAMES the #1 way to improve. A game JAM (build in a weekend)
forces you to scope + ship -> you learn more than any tutorial.
GO DEEPER revisit Game Math / Physics / Graphics / AI as your games
demand more; try 3D once 2D feels comfortable.
ENGINEERING version control, testing, and CI (their own courses) keep
bigger projects maintainable — and enable team work.
SHARE export to Web, post it, get feedback, iterate.
Make games, finish them, share them. That loop is how game developers grow.