How it's built
- Fixed-timestep game loop: physics runs at 120 updates per second, decoupled from rendering via requestAnimationFrame
- Canvas 2D rendering scaled for high-DPI screens and resized live with ResizeObserver
- Procedurally generated asteroids; bullet hits use point-in-polygon ray casting on rotated shapes
- Seamless screen wrapping: objects crossing an edge are drawn on both sides
- Particle system with additive blending for thrusters and explosions, plus screen shake
- Every sound is synthesized live with the Web Audio API; there are no audio files
- Touch joystick built from Pointer Events with pointer capture
- Glass-style HUD, CSS keyframe banners and prefers-reduced-motion support
- High scores saved in localStorage. No libraries, no frameworks, no build step
โ Back home