Bootcamp
Game dev one-day bootcamp: pick an engine, scaffold, sprite + input + physics + audio + UI, ship a playable build.
Game dev — bootcamp
EXAMPLE
# ===== 0-30 min: pick the engine =====
# For a fast first day:
# - Godot 4 (open source, gentle learning curve)
# - Unity 6 (mainstream, C#)
# - Phaser 3 (web-only, JS)
# - GameMaker (drag-drop + GML scripting)
# Examples below use Godot 4 with GDScript.
# ===== 30-60 min: scaffold =====
# Download Godot. Create a new project.
# Create the main scene:
# - Node2D (root) named 'Main'
# - CharacterBody2D as 'Player' with:
# - Sprite2D (assign a texture)
# - CollisionShape2D (rectangle)
# - StaticBody2D platforms with CollisionShape2D
# Save as main.tscn. Set as main scene.
# ===== 60-120 min: input + movement =====
# Project Settings -> Input Map -> add 'left', 'right', 'jump' actions.
# player.gd attached to Player:
extends CharacterBody2D
const SPEED = 200.0
const JUMP = 400.0
const GRAVITY = 980.0
func _physics_process(delta):
velocity.x = Input.get_axis('left', 'right') * SPEED
if not is_on_floor():
velocity.y += GRAVITY * delta
if Input.is_action_just_pressed('jump') and is_on_floor():
velocity.y = -JUMP
move_and_slide()
# ===== 120-180 min: enemies + collisions =====
# Add an Enemy (Area2D + Sprite2D + CollisionShape2D).
# enemy.gd:
extends Area2D
@export var speed: float = 80.0
var direction := 1.0
func _process(delta):
position.x += direction * speed * delta
func _on_body_entered(body):
if body.name == 'Player':
body.die()
# In editor: connect body_entered signal to _on_body_entered.
# Player's die():
func die():
queue_free()
get_tree().reload_current_scene()
# ===== 180-240 min: score + UI =====
# CanvasLayer with Label child.
# Singleton (AutoLoad) game_state.gd:
extends Node
signal score_changed(new_score: int)
var score: int = 0
func add_score(amount: int) -> void:
score += amount
score_changed.emit(score)
# UI script:
func _ready():
GameState.score_changed.connect(_on_score_changed)
func _on_score_changed(new_score):
$Label.text = 'Score: %d' % new_score
# ===== 240-300 min: audio =====
# AudioStreamPlayer node + drag-drop a sound asset.
# Trigger in code: $JumpSound.play()
# Pool short sounds; use AudioStreamPlayer2D for spatial sounds.
# ===== 300-360 min: level design =====
# TileMap + TileSet for platforms.
# Multiple levels via separate .tscn files; reload via get_tree().change_scene_to_file().
# ===== 360-420 min: export =====
# Project -> Export. Add a preset (Web, Android, Windows, macOS, Linux).
# For Web: download HTML5 export templates.
# Output: index.html + .wasm + .pck.
# Host on itch.io for free; takes the HTML5 build.
# ===== 420-480 min: polish =====
# - Particle effects (CPUParticles2D) on jumps, deaths
# - Camera2D following the player
# - Background music
# - Title + game over screens
# - Best score in user:// directory
# ===== Patterns to internalise =====
# - Fixed timestep (Godot does this for _physics_process)
# - Signals for loose coupling between nodes
# - AutoLoad / global script for state
# - Scenes as reusable units; instance instead of duplicate
# - Always profile early; phones / web are slower than your dev machine
# ===== Pitfalls =====
# - Heavy script in _process (move to _physics_process or signals)
# - Forgetting to use export templates for the target platform
# - Mixing units (pixels vs meters)
# - Skipping pause + audio mute (users expect them)
Why it matters
A one-day game dev bootcamp: scaffold, player, enemy, score, audio, level, export. Godot is the friendliest start; the same shape works in Unity / Phaser / Bevy. Ship a playable build on itch.io and you have your first game out the door.
Tip: Tweak the snippet with Try it Yourself », then sit the quiz at the bottom of the page.
Discussion
Loading…