Karate Champ hit arcades in 1984 and Street Fighter II blew the doors off the genre in 1991 (verified against en.wikipedia.org/wiki/Fighting_game on 2026-08-12), and every hobbyist who wants to make one now runs into the same wall: rendering two silhouettes on a screen is trivial, but the state machine, the frame data table, the hitbox and hurtbox pairs, and the input buffer that turn those two silhouettes into a fighting game are a genuine engineering problem. Most first-time attempts at how to make a fighting game bail out somewhere between the third animation and the first punish combo. The 2026 pipeline is very different: a coding agent scaffolds the six-state character controller in one prompt, a shared frame data table balances the roster in a spreadsheet, and the whole build ships in a browser tab. That means WizardGenie to scaffold the state machine and hitbox loop, Sorceress AI Image Gen for the character portraits and stage backgrounds, Quick Sprites for the walk cycles and idle stances, SFX Gen for the punch impacts and blocks, and Music Gen for the arena theme. This guide is the honest end-to-end for how to make a fighting game in 2026.
What “how to make a fighting game” actually means in 2026
The query “how to make a fighting game” hides three very different requests. Some searchers want a traditional 2D one-on-one fighter on a single screen — two characters, a health bar each, a round timer, a light-medium-heavy attack layer. Some searchers want a platform fighter (Super Smash Bros style, percentage-based knockback, multiple platforms, off-stage recovery, ledge grabs). Some searchers want an arena 3D fighter (Tekken, Soul Calibur, Virtua Fighter) with sidestep, a camera that follows the action, and 3D collision. This guide targets the traditional 2D one-on-one build first because it is roughly one-quarter the code of a platform fighter and one-eighth the code of a 3D arena fighter, and the core systems (state machine, frame data, hitbox versus hurtbox, input buffer) are exactly the same in every genre. Ship the 2D single-screen build; port the systems up to a bigger genre in a v2.
Four systems separate a fighting game from a generic 2D action game. The character state machine is the outer loop; every character is in exactly one state per frame (idle, walk, jump, attack, block, hitstun) and every transition is explicit. The frame data table is the balance sheet; every move publishes its startup, active, and recovery frame counts, plus damage and on-block advantage. The hitbox versus hurtbox check is the collision system; every character has one or two hurtboxes (the body that can be hit), and every attack turns on one or more hitboxes (the fist arc, sword tip, or projectile) during its active frames. The input buffer is the accessibility layer; the last several frames of keyboard input are stored in a queue and replayed against the current state every frame so combos land on lenient timing. Get these four right and the game feels like a real fighter on a first pass, even if the sprites are stick figures.
The fighting game loop in one minute (input, state, hitbox, advance)
Four moving parts and nothing else, in a strict order per frame, sixty times per second. First, read player input and push it to a small ring buffer (last 10 keyboard events, tagged with the frame index they arrived on). Second, evaluate state transitions for both players against the buffer — if the current state allows a new action (idle or the final recovery frames of the previous move) and the buffer contains the right input, transition to the new state and reset the state frame counter. Third, advance the state frame counter, and if the current state is an attack, check whether this frame falls inside the startup, active, or recovery window per the frame data table. If active, turn on the hitboxes for this move. Fourth, collide every active hitbox against every hurtbox on the opposing character — if any pair overlaps, apply damage, push the opponent into HITSTUN for the on-hit frame count, and reset the buffer so the hit does not cascade into a chain the player did not input.
That is the entire game. Four steps, driven by a fixed 60 hertz timer using requestAnimationFrame with a delta-accumulator so the logic stays stable on any refresh rate. Everything else — the arena background, the health bars, the round timer, the announcer voice on ROUND 1 FIGHT, the K.O. screen, the character-select roster, the win-pose animation, the arcade endings — is polish layered on top of these four steps. If you keep the loop deterministic (same inputs plus same starting state equals same outcome), you get replays, ghost fights, and eventually rollback netcode for free later. Fight the temptation to add cinematic supers or interactive stages on the first pass. Ship the pure four-step loop with two characters and three moves each, then extend.
Pick your engine for how to make a fighting game: Phaser 4, vanilla Canvas, or WizardGenie
Three good browser targets in 2026, each with a very different trade-off. Phaser 4.2.1 “Giedi” (released 9 July 2026, verified against phaser.io/download/stable on 2026-08-12) is the honest default and the one this guide recommends for a first fighting game build. Phaser ships Scene management, an asset loader, sprite atlases, input, and audio playback in one file — roughly 900 KB minified, which is fine for a mobile browser build. Its Arcade Physics system is enough for the flat-arena gravity and the ground collider; you do not need a heavyweight physics engine for a fighter because most of the collision is hitbox-versus-hurtbox rectangles that you write yourself. The sprite animation system is exactly what a fighter needs: frame-indexed animations with per-frame callbacks so you can turn hitboxes on and off on specific frames.
Vanilla HTML5 Canvas plus a small JavaScript state model is the right pick if you want to understand every line and keep the total build size under 100 KB. A working two-character single-screen fighter is roughly 800 lines of JavaScript. You render sprites with CanvasRenderingContext2D.drawImage, read input with keydown / keyup events on the KeyboardEvent API, and tick the game at 60 Hz with requestAnimationFrame. Everything is under your control, which matters if you have specific rendering ideas (a scanline shader, a CRT filter, a chromatic-aberration K.O. flash) that would be awkward in Phaser. It is also the pick for a code-teaching build where the goal is to show every part of the pipeline.
WizardGenie is not a separate rendering engine — it scaffolds whichever of the above you pick, from a single natural-language prompt. WizardGenie is the Sorceress game-native coding agent. It ships as both a Windows desktop app (installer with auto-update, available to Early Access supporters and above) and a no-install web build at the same URL, and its coding-model lineup (verified 2026-08-12 in src/app/_home-v2/_data/tools.ts lines 734 to 743) covers Claude Opus 4.7, Claude Sonnet 4.6, GPT-5.5, Gemini 3.1 Pro, DeepSeek V4 Pro, Kimi K2.5, Grok 4.2, and MiniMax M2.7. For a fighting game with a small roster, any of the frontier models can scaffold the entire six-state character controller plus the frame data loop plus the hitbox check in one prompt. If you want to run cheap on a longer session, pair a frontier planner (Claude Opus 4.7 or GPT-5.5) with a budget executor (DeepSeek V4 Pro or Kimi K2.5) — the planner writes the frame data table and the state machine spec, the executor types the code. That pairing runs at roughly one-fifth the cost of a single-frontier session.
What about Three.js for a 3D arena fighter? Three.js r185 (verified against threejs.org on 2026-08-12) is a fine 3D renderer, but a 3D fighter is a season-long project on its own. Ship the 2D single-screen build in this guide first, then read a dedicated 3D-fighter deep-dive when you are ready. If you already have a 3D fighter in mind and cannot resist, at minimum finish the 2D state machine and frame data on a paper design doc before you write a line of 3D code — those two systems are identical in 2D and 3D, and getting them right without the 3D rendering complexity is a much faster first pass.