Orbit Assault: an arcade orbital invasion
An arcade on our own engine: waves of aliens descend on your tank, a saucer flies overhead and the shields crumble brick by brick.
Controls: Z — left, X — right, M — fire, Esc — pause. On phones, use the on-screen buttons. Open the game full screen ↗
The task
We wanted an arcade game that runs from a link on any device, stays crisp on any screen, weighs tens of kilobytes and pulls in neither a game engine nor audio files.
The solution
- DHTML rendering: every sprite is a page element with a sprite sheet in background-position, no canvas. The browser composites the layers itself, and the pixel art stays crisp at any scale.
- Sound is synthesized on the fly with Web Audio: the saucer siren, shots, explosions and hit crackle are built from oscillators, noise and filters, without a single audio file.
- Our own engine: a game loop on requestAnimationFrame, an event bus and a collision grid where hits are checked only between neighboring cells.
- The TypeScript code is split into Feature-Sliced Design layers, and the linter checks the layer boundaries. The platform sits behind an interface, so the same game builds for the site and for game platforms.
Details
- The field scales to the screen, phones get three on-screen buttons and the layout rebuilds itself in portrait orientation.
- Five sprite skins are generated by a script: it recolors only opaque pixels by zone, keeping their brightness, so the shapes stay the same.
- About 200 unit tests plus a headless check of the real scene; promo shots are taken by a script that plays the game itself.
Technologies
- TypeScript
- Feature-Sliced Design
- DHTML sprites
- Vite
- Web Audio
- Pointer Events
- Yandex Games SDK
