Skip to main content
Part of the make-game skill. The skill links here when your agent needs the detail.
Side-scrolling platformer blueprint: architecture, the level, and the core loop. Movement itself lives in the character-movement skill (base controller) and its platformer-feel reference (summer_docs_read id skill/character-movement/references/platformer-feel.md: coyote time, jump buffer, variable height) - do not rewrite it here; wire it in. For Celeste-grade precision movement (dash, wall jump, climb) use celeste-momentum-platforming instead.

Minimum playable base (build this first)

Scene first (the make-game Scaffold phase): main.tscn with a Node2D root, a ground StaticBody2D with a CollisionShape2D, the player, and a Camera2D child of the player. Prove run + jump + land before anything else. Placeholder art is a colored ColorRect/Sprite2D.

Architecture (grows into a full game)

Add autoloads only once the base loop works. Register in Project Settings in dependency order: EventBus first (others reference it), then GameManager, then the rest. All autoloads process_mode = ALWAYS so they survive pause.

Collision layers (set names in Project Settings)

Hitboxes mask the OPPOSING hurtbox (see the combat-basics skill). The stomp detector is a separate Area under the player masking only the Enemies layer.

Building the level with a TileMap

Use a TileMapLayer for the solid world. Create a TileSet, paint the collision polygon on the solid tiles, put the layer on the World collision layer. The player collides with it for free - no per-tile StaticBody.
  • One TileMapLayer for collidable terrain, a second (no collision, lower z-index) for background decoration.
  • For large levels, split into room .tscns and load the current room via a RoomManager; connect doors to change_scene_to_file or swap room instances.
  • Parallax background: Parallax2D (or ParallaxBackground) layers with motion_scale < 1 so distant layers move slower.

Moving, one-way, and crumbling platforms

These three cover most platformer level tech.
Use AnimatableBody2D (not StaticBody2D) for movers - it carries the player. For one-way platforms, enable one_way_collision on the platform’s CollisionShape2D so the player jumps up through and lands on top. Crumbling platform: on body_entered, start a short timer, shake, then disable collision and fade out; re-enable after a respawn delay.

Checkpoints and death

Core loop checklist (the 30-second bar)

  • Run + jump feels good (tuned gravity/fall multiplier, coyote + buffer).
  • Coins/goal give immediate feedback: sound + pop tween + counter tick.
  • Death is instant and respawns at the last checkpoint, no long reload.
  • A visible goal (flag/door) ends the level with a clear result.
Enemies, hazards, juice, and metroidvania progression are in 2d-platformer-polish.md.
Source: library/skills/make-game/references/2d-platformer.md, rendered from summer-engine@4.3.0 on npm.