Quick answer: Density 0 = static body. For dynamic motion, use density > 0 (e.g. 1.0). Static bodies must be moved via phy_position_x / phy_position_y.
A platformer player object has a physics fixture with density 0. Forces don’t move it. Density 0 marks the body as static in Box2D.
Set Density > 0
// in Create event after physics_fixture_set_*
physics_fixture_set_density(fixture, 1.0);
physics_fixture_set_restitution(fixture, 0.0);
physics_fixture_set_friction(fixture, 0.5);
physics_fixture_bind(fixture, id);
Body becomes dynamic. Forces, gravity, and impulses move it.
Kinematic Variant
For player-controlled motion without physics-driven response (e.g. precise platformer), use kinematic:
phy_dynamic = false;
phy_speed_x = 2.0; // move horizontally each step
Kinematic = manually moved but participates in collisions.
Static Bodies for World
Walls/floor: density 0 is correct. They never move. Player and enemies need density > 0.
Verifying
Apply force; player moves. Walls stay still. Gravity affects only dynamic bodies. Collision response works.
“Density encodes body type: zero = static, positive = dynamic. Pick based on motion needs.”
For platformers, hybrid approach: kinematic player, dynamic boxes, static world — gives crisp control while keeping physics interaction.