Drag anywhere on the screen to steer · tap to launch
Cabinet online · sector 7 · 60 fps
32 cyan blocks. One 3‑pixel ball. Three lives and a paddle that answers to your finger, your mouse, or your arrow keys.
Drag anywhere on the screen to steer · tap to launch
Everything below runs on vanilla JavaScript and one Canvas context. No engines, no libraries, no image assets — physics stepped at a fixed 60 Hz with a delta accumulator so motion stays identical on 60 Hz and 120 Hz panels.
The ball's bounding box is tested against every live brick, the closest intersecting brick wins, and the axis with the smaller penetration decides the flip: top/bottom inverts dy, left/right inverts dx. One brick is consumed per frame, so a corner entry can never tunnel or double-count.
After every impact the velocity vector is re-normalised back to the target magnitude — 3.45 px/frame at launch, easing to 4.00 as the wall thins. Angle changes never leak energy, and a vertical-stall guard nudges any trajectory that gets too horizontal.
Contact uses closest-point circle/AABB resolution. Hitting the top face maps the offset from centre to a ±60° exit angle; striking the rim or underside pushes the ball sideways instead, so edge saves feel earned rather than random.
Pointer moves, keyboard velocity and touch drags all write to a single paddle target that's eased at 42% per step. Touch coordinates are mapped through the canvas's live bounding rect, so the game stays pixel-accurate at any viewport size or orientation.