OverviewHistoryStatsSecurity
npx skills add ...
Documentation
SKILL.md
npx skills add gamedev-skills/awesome-gamedev-agent-skills --skill godot-2d-movement
Implement 2D kinematic character movement in Godot 4.7 with CharacterBody2D and move_and_slide(): platformer run/jump with gravity, top-down 8-direction motion, slope handling, and reading collisions. Use when coding a 2D player or enemy controller, a platformer or top-down character, or fixing move_and_slide()/ is_on_floor() behavior in a .tscn with a CharacterBody2D.
npx skills add gamedev-skills/awesome-gamedev-agent-skills --skill godot-2d-movement
Build responsive 2D character controllers with CharacterBody2D and the argument-less
move_and_slide(). Targets Godot 4.7.
move_and_slide() "does nothing", the character sinks through floors, or
is_on_floor() is always false.When not to use: dynamic rigid bodies, areas, raycasts, collision layers →
godot-physics; tile-based levels → godot-tilemap; full platformer game template →
the platformer genre skill; engine-agnostic feel tuning → physics-tuning.
CharacterBody2D with a CollisionShape2D child. It is script-driven: it
does not fall or react to forces on its own.velocity property, then call move_and_slide() (no arguments in 4.x).
The method reads velocity, moves the body, slides along surfaces, and updates
velocity to reflect what actually happened._physics_process(delta) — move_and_slide() uses the physics step's
delta internally, so do not multiply velocity by delta yourself.velocity.y each tick, jump by setting velocity.y
negative when is_on_floor().motion_mode = MOTION_MODE_FLOATING so there is no "floor/wall" distinction.is_on_floor(), is_on_wall(), get_wall_normal(), and
get_slide_collision(i) after the call.move_and_slide(velocity) (returning the new velocity) was
removed. In 4.x set the velocity property and call move_and_slide() with no args.
move_and_slide(velocity, Vector2.UP) will not parse.move_and_slide() already accounts for the physics
delta. Setting velocity = dir * speed * delta makes the body crawl._process instead of _physics_process causes frame-rate-dependent,
jittery motion. Always move in _physics_process.is_on_floor() always false when up_direction is wrong (default Vector2.UP),
there is no CollisionShape2D, or you never called move_and_slide() this frame.position += instead of velocity + move_and_slide().floor_stop_on_slope = true (default) and set a
floor_snap_length so the body sticks to downward slopes.move_and_collide() (manual collision response), read references/controller-recipes.md.godot-physics — collision layers/masks, areas, raycasts, rigid bodies.godot-tilemap — building the levels this character walks on.godot-animation — driving sprite/skeletal animation from movement state.camera-systems — follow camera, deadzone, and look-ahead that track this character.platformer / input-systems — full genre template and rebindable input.