Flukz — open-source shmup community resource open-source GPL devlog  ·  about
// indie shmup & game-dev resource

Game Dev · July 6, 2026

Player Ship Movement Tuning in Shmups: Acceleration, Drag, and Turn Rate

A ship that reads the stick correctly but still feels wrong to fly is almost always a movement-tuning problem, not an input-lag problem. Getting the button press in fast is only half the job; what happens to velocity after that press is the other half, and it is the half most new developers skip past.

It is tempting to treat ship movement as a solved problem once input handling is responsive: read the stick or keys, set velocity, move the sprite. That gets a ship on screen, but it produces a specific and recognizable feel — instant snap to top speed, instant stop, no sense of mass at all. Some games want exactly that. Most bullet-hell shmups do not, because a ship with zero inertia removes a layer of skill expression that separates players who can just barely graze a bullet from players who cannot.

Instant velocity versus an acceleration curve

The simplest movement model sets velocity directly from input: hold right, move right at max speed, release, stop immediately. It is easy to implement and perfectly readable, which is why it shows up in a lot of jam prototypes. The tradeoff is that it removes any distinction between a tap and a hold, and it makes micro-adjustments — the small nudges players make while threading a bullet gap — feel identical to full-speed movement. Adding even a short acceleration ramp, on the order of a tenth of a second to reach top speed from a standstill, reintroduces a sense that the ship has mass without making it feel sluggish. The ramp does not need to be long to be felt; players notice the difference between zero and a hundred milliseconds far more than the difference between a hundred and two hundred.

Drag and the cost of stopping

Drag — how quickly velocity decays once input stops — matters as much as acceleration and is tuned separately. Symmetric acceleration and drag values feel natural for most shmups: a ship that takes as long to stop as it does to start reads as consistent. Some games intentionally break that symmetry, applying near-instant stop but gradual acceleration, to make starting a dodge feel deliberate while stopping mid-dodge feels safe and immediate. That asymmetry is a legitimate design choice, but it should be a choice, not an accident of whichever value got tuned first and the other left at a default.

Turn rate on analog input

Digital input (keyboard, d-pad) only ever points in eight directions, so turn rate barely matters — the ship either faces a direction or it does not. Analog stick input changes this: the ship can be asked to move at any angle, and if the underlying movement model snaps directly to that angle every frame, fine stick movements near the deadzone produce visibly jittery direction changes. A turn-rate cap — capping how many degrees per frame the effective movement direction can change — smooths this out without adding perceptible lag, as long as the cap is generous enough that a full stick reversal still completes within a couple of frames. Set it too conservatively and players correctly perceive the ship as failing to follow the stick.

Speed modifiers and the hitbox they expose

Most shmups include a focus or slow-movement mode, usually bound to a shoulder button, that reduces ship speed and often reveals a smaller, more precise hitbox for threading dense patterns. The speed reduction itself should be treated as its own tuned value rather than an arbitrary fraction of top speed — half speed is a common default, but games with denser patterns often go lower, down to a third or less, because the entire point of focus mode is to buy the player enough control precision to survive a screen that would otherwise be unreadable at full speed. The transition between modes matters too: an instant speed change on button press or release feels crisper than an eased transition, which is one of the rare cases where instant response is correct even in a game that otherwise uses acceleration curves everywhere else.

Tuning by feel, verified by data

None of these numbers can be derived analytically from first principles — they get tuned by playing the game repeatedly and adjusting until movement stops calling attention to itself. A useful discipline is keeping every movement constant in a single exposed config block rather than scattered across scripts, so a single tuning pass can sweep acceleration, drag, and turn rate together and feel the interactions between them, since changing one usually shifts what feels right for the other two. The CharacterBody2D reference in the Godot documentation is a solid starting point for the underlying velocity and collision-response mechanics regardless of which engine a project ultimately ships on, since the physical concepts translate directly even where the API does not.

Once the movement model itself feels right in an empty test room, retest it against real bullet density. A ship that feels great with nothing on screen can still feel wrong once forty bullets are converging on it, because the player's attention and reaction budget under pressure is different from a calm test room, and turn rate or drag that felt invisible in isolation can suddenly feel like it is fighting the player during an actual dodge.