Skip to main content
Part of the character-movement skill. The skill links here when your agent needs the detail.
The base controller in SKILL.md runs, but a raw is_on_floor() jump feels stiff and unforgiving. These four additions are what separate a prototype from a game that feels good. Add them in this order; each is independent.

Coyote time

Let the player jump for a few frames AFTER walking off a ledge. Without it, jumps near edges feel like the game ate the input.

Jump buffering

If the player presses jump a few frames BEFORE landing, remember it and fire on touchdown. Without it, fast players feel like jumps get dropped.

Variable jump height

Tap = short hop, hold = full jump. Cut upward velocity when the button releases.

Asymmetric gravity (fall faster than you rise)

A heavier fall gravity is the single biggest feel upgrade. Rising floaty, falling snappy reads as responsive.

One-way platforms

Use a CollisionPolygon2D/CollisionShape2D on a platform with one_way_collision = true in the platform’s collision shape. Drop through by briefly disabling the player’s collision with that layer, or move the player to a lower collision layer while move_down is held.

Tuning starting points

Never ship default gravity 980 with a -350 jump and call it done - that is the “why does my jump feel bad” default. Tune fall_multiplier first.
Source: library/skills/character-movement/references/platformer-feel.md, rendered from summer-engine@4.3.0 on npm.