READY?
Mouse, finger or ← → drive the shield.
Release the ball at any angle you like.
GAME OVER
0
YOU WON!
Every block reduced to light.
READY?
Mouse, finger or ← → drive the shield.
Release the ball at any angle you like.
GAME OVER
0
YOU WON!
Every block reduced to light.
The ball carries a constant magnitude. Every contact it makes is allowed to flip exactly one velocity component — never both, never the energy itself. That single restriction is what turns a plain rectangle into a decision engine.
Detection runs on swept-axis bounding boxes, subdivided into sub-steps small enough that nothing crosses a 20 px slab in one tick. When several blocks overlap the ball at once, only the deepest-penetrating one resolves — so a clean pair of pops costs a single bounce, and the velocity magnitude survives untouched. Rendered entirely by hand on one <canvas>, fixed-step physics, requestAnimationFrame presentation.
Left, right and ceiling swap a single sign. Zero energy lost, zero memory kept.
Contact point becomes angle: dead centre returns the ball vertically, edges bite up to ±50°, and the shield's own momentum leaks a little spin into the flight.
The shallower overlap axis decides which face was struck. Armoured blocks take two visits to fall.
Removes a shield and rewinds the ball onto what's left. Three misses and the cabinet dims.