Behind the Game

Building 3D Fighter

How one prompt — “a 3D hand to hand combat in the spirit of Street Fighter, Tekken and Mortal Kombat” — became the collection’s first WebGL game, engine and all.

Every game in this collection so far had been Canvas 2D. Then a prompt landed that could not be: “a 3D hand to hand combat in the spirit and vein of street fighter mortal combat tekken etc.” A one-line brief for a genre that lives or dies on feel. This is what the studio did with it.

The leap to 3D — without breaking the promise

The collection has one non-negotiable: every game is a single page you open and play, offline, with nothing to install. Three.js is the obvious engine for real-time 3D in a browser — but a game that fetches a library from a CDN is not zero-install. So the engine ships with the game: three.min.js sits right next to index.html and loads over file:// exactly like the Canvas games. The 3D is new; the promise is not.

Fighters that are actually articulated

Each fighter is a humanoid built from primitive meshes parented into a joint hierarchy — not a sprite, not a rigged import. Attacks are per-joint poses the animator lerps toward each frame, driven by phased startup / active / recovery windows. Facing flips by rotating the root node, not by mirroring the scale, because a mirror would invert the lighting and give you a fighter lit from the wrong side.

The part players feel but never see

Fighting games are frame data. The fight logic runs on a fixed 60 Hz timestep decoupled from rendering: hitboxes exist only during a move’s active frames, one hit per move, blocking is height-checked (you can’t block a low while standing), knockback decays with juggle decay, and every clean hit triggers hitstop — that brief freeze on impact that makes a punch land. Specials come out of a rolling input buffer that watches for quarter-circle motions. The CPU reads the range to its opponent, buckets it, and picks weighted actions with a reaction delay, so it feels like it is playing rather than cheating.

Sound with no sound files

As with every game here, the audio is synthesised in the browser — impact, block, whiff, jump, land, fireball, KO, round start, victory — with the smack of a hit scaled by the power of the blow. No files fetched, no exceptions.

Shipped as it came out

That is the whole point of this place: the prompt is on record, the studio ran it end to end, and what you play is what the machine made. If a later iteration changes the feel in a way worth talking about, it will show up here.