A 3D game with a 2D layer on the same canvas
Nothing is built until you arrive.
Fly a corridor of neon towers that do not exist yet. Every row you pass is rebuilt a kilometre ahead, and its buildings rise out of the ground as you reach them — the skyline is not a map, it is an answer to where you are. Collect the shards, stay off the walls, and the city keeps coming.
One canvas holds both worlds: the city, the ship, the lights, the shadows and the fog are 3D; the score, the shield, the boost bar and the radar are 2D drawn straight over them. The whole city is four instanced draw calls — bodies, roof lights, neon edges and lit windows — so it holds 60 frames a second while you fly.
LittleJS 1.27 · WebGL2 · one HTML file · no build step · no account
Fly it
Ready — press Play, or Space
The city is generated in rows. A row you have passed is thrown away and rebuilt far ahead, so what you see behind you exists only in the moment you saw it.
How it is made
Two renderers, one canvas
LittleJS 1.27 added a 3D pass that shares the engine's canvas with the 2D layer. The hull, the towers, the roof lights, the shadows, the fog and the particles go through the 3D pass; the HUD and the radar are the ordinary 2D drawing calls, on top, in the same frame. That is why the score can sit over a rotating city without a second element or a second canvas.
The city is four draw calls
Every tower is an instance of one box. Bodies, roof bands, two neon edge strips and three lit windows each live in an InstancedMesh3D, so seven hundred-odd buildings cost four draw calls per frame no matter how many are standing. Collision is a plain box test against the rows near the ship.
The towers grow as you arrive
A row that falls behind the ship is moved to the far end of the corridor, given fresh heights, and grown from zero over about half a second. That is the whole trick, and it is the reason the skyline looks alive instead of loaded.
Privacy
This page sets nothing until you answer the cookie question. If you decline, no request of any kind goes to Google — the analytics script is not in the page at all; it is created only after a yes, and the choice is remembered in this browser.
The game itself runs entirely in your browser. Nothing you do in it is sent anywhere: there is no account, no server side to the game, and no score is uploaded. The only thing measured is the visit, and only if you allow it. Your best score is kept in this browser's local storage and nowhere else.