game-feel
Installation
SKILL.md
Game feel: the numbers
Game feel = real-time control + simulated space + polish (Swink). The polish amplifies the simulation but never lies about it: if the screen shakes, something must have hit. Small tweaks compound — Vlambeer's flat shooter becomes Nuclear Throne via ~30 individually-invisible tricks. Apply them in passes, then play it: feel is tuned in motion, never designed on paper.
All frame counts assume 60fps — which means physics must be
delta-time-based. Per-frame integration (x += vx) runs 2× fast on a 120Hz
display; this is the single most common feel bug in browser games. Multiply
all motion by dt, and convert the frame windows below to ms when your loop
isn't fixed-step.
- Never derive a bounce/return angle from penetration depth at the
detection frame (
atan2(ball.y − paddle.y, …)): depth ∈ (band − v·dt, band] is integration noise, so the same hit returns steep at 144 Hz and shallow at 30 Hz. Use the tangential offset only (x-offset across the face → linear angle curve), or back-project to the band-entry point first.