Movement feel comes from velocity, acceleration and friction applied every frame, plus gravity pulling objects down and a negative-velocity jump that gravity naturally arcs back down — with double jump and dash layered on top.
1-B 2-B 3-B 4-B | 5 velocity (vel) 6 acceleration 7 = if on_ground: jumps_left = MAX_JUMPS 8 = it prevents the dash from being spammed repeatedly, forcing a delay between uses 9 = movement must be applied first so the new position exists to be clamped; clamping first would use the stale old position and let the object briefly overshoot before being corrected | 10 = instant snapping feels robotic/twitchy because there's no sense of weight or momentum; gradual acceleration mimics real physical objects building up speed, which reads as more natural and controllable