Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Build a 2D platformer: run/jump control with coyote time, jump buffering, and variable jump height, plus tiled levels and hazards. Use for a platformer or Mario/Celeste-like, or tuning jump feel.
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-12 | ✗→✓ | ▲ Improved | 117% | 0% |
| case-15 | ✗→✓ | ▲ Improved | 28% | 0% |
| case-19 | ✗→✓ | ▲ Improved | 33% | 0% |
| case-01 | ✓→✓ | = Same ✓ | 52% | 0% |
| case-02 | ✓→✓ | = Same ✓ | 74% | 0% |
A playbook for 2D platformers — the run/jump controller "feel", level structure, hazards, and goals. This is a compositional skill: it wires an engine movement skill, a tilemap skill, and design skills into a working game. It does not re-teach physics or tilemaps; it tells you what to build and how to make jumping feel good.
"Celeste-like", or any game whose core verb is jump between surfaces.
(coyote time, jump buffering, variable height, corner correction).
When not to use: top-down movement with no gravity → use the engine movement skill directly. 3D first-person traversal → fps-shooter. Grid/turn movement → roguelike. For the raw kinematic body API, use godot-2d-movement (or your engine's controller skill).
Observe a gap/hazard → commit to a jump or move → land safely (or die) → reach the next checkpoint/goal. A platformer lives or dies on the moment-to-moment feel of that single jump, repeated thousands of times. Tighten the controller first; everything else is content.
Tune these by outcome (height in tiles, time to apex in seconds), not by raw numbers.
| Knob | Effect | Sane starting point | |------|--------|---------------------| | Max jump height | reach | 3–4 tiles | | Time to apex | "weight"/snappiness | 0.30–0.40 s | | Fall gravity multiplier | snappy, non-floaty fall | 1.5–2.0× rise gravity | | Coyote time | jump just after leaving a ledge | 0.08–0.12 s (~5–7 frames @60) | | Jump buffer | press just before landing still jumps | 0.10–0.15 s | | Variable jump cut | tap = short hop, hold = full | cut upward velocity ×0.4–0.5 on release | | Apex hang | brief float at the top for air control | reduce gravity ×0.5 near |vy|<threshold | | Ground accel / friction | responsiveness vs. ice | reach top speed in 0.05–0.1 s | | Corner correction | nudge past a ledge clipped by 1–2 px | nudge up to ~4 px sideways |
Derive gravity and jump velocity from the feel values rather than guessing — see Pattern 1.
python# Pseudocode. Pick the FEEL you want, then derive the physics. y-axis points DOWN. # From kinematics: h = (g * t^2) / 2 and v0 = g * t. JUMP_HEIGHT = 3.5 * TILE # how high, in world units TIME_TO_APEX = 0.35 # seconds to reach the top gravity = (2 * JUMP_HEIGHT) / (TIME_TO_APEX ** 2) # rising gravity jump_velocity = -(2 * JUMP_HEIGHT) / TIME_TO_APEX # negative = upward fall_gravity = gravity * 1.8 # heavier on the way down → less floaty
python# Pseudocode in the per-frame update. dt = seconds since last frame. # Timers count DOWN; refresh coyote while grounded, buffer on a fresh press. if on_floor: coyote_timer = COYOTE_TIME # 0.1 if jump_pressed_this_frame: buffer_timer = JUMP_BUFFER # 0.12 coyote_timer -= dt buffer_timer -= dt # A jump is allowed if we pressed recently AND were grounded recently. if buffer_timer > 0 and coyote_timer > 0: velocity.y = jump_velocity buffer_timer = 0 coyote_timer = 0 # consume both so we can't double-jump # Variable height: releasing jump early while still rising cuts the arc short. if jump_released_this_frame and velocity.y < 0: velocity.y *= 0.45 # Asymmetric gravity: snappier fall than rise. g = fall_gravity if velocity.y > 0 else gravity velocity.y += g * dt
Solid from above, pass-through from below. Most engines expose a "one-way collision" flag on the tile/collider; enable it and let the player drop through by disabling that collision for a few frames when the player holds Down + Jump. Do not re-implement collision math.
dt → speed changes with frame rate. Every velocityintegration and timer must use dt. (See physics-tuning.)
per-tile colliders, and add corner correction.
timestep for fast bodies (see physics-tuning).
godot-2d-movement (Godot CharacterBody2D); for other engines usethe engine core + physics skill (unity-physics, phaser-arcade-physics, pygame-core).
godot-tilemap / unity-tilemap-2d for geometry; level-design for layout,pacing, and teaching order.
physics-tuning for timestep, CCD, and stability.input-systems for buffering, rebinding, and gamepad support.audio-design for SFX/music; the engine animation skill for squash/stretch.prototype-fast to greybox the controller before building content.platforms, and camera follow, read references/feel-tuning.md.
Other measured skills in the registry, with their headline benchmark lift.