Most jam fighters die on Sunday morning because someone tried to build a roster instead of a match. A punch on frame one is a hitscan bug; a swing with no startup is not a fighting-game attack. Brace one screen, two attacks, and honest hitboxes before you commission a single sprite.
What how to make a 2d fighting game must lock
The head query how to make a 2d fighting game hides two different projects. One is a weekend jam that has to ship. The other is a lifelong hobby project that never ships. This post is about the first one. If you want the second, ignore every stop rule below and enjoy year three of "just fixing the input buffer."
A shippable jam fighter locks five things before pixel one:
- One screen. Fixed camera, no scroll, no arena transitions. The camera arguing with the walls is a full weekend by itself.
- One hero, one dummy. The dummy can be a mirror of the hero. It does not need AI on pass one—it needs to stand there and take hits so playtest data exists.
- Two attacks. A quick jab and a heavy commit. Every classic 2D fighter grammar reduces to these two shapes before it grows.
- One win condition. Health hits zero, KO pose plays, round resets. No timers, no rounds-of-three, no super meter on pass one.
- Honest hitboxes. A separate rectangle for what damages and what gets damaged. Not the sprite's alpha bounds.
Anything larger than that list is scope creep dressed as ambition. Fighting games as a genre carry decades of hidden systems—cancels, throws, chip damage, block strings—but a first playable does not need any of them. It needs a loop that reads on video.
The pipeline this post uses stays on three Sorceress tools: WizardGenie for the loop and the input handler, Quick Sprites for walk and attack rows, and SFX Gen for the punch and hit-stun beats. Everything else is either a distraction or a v2 problem.
The workflow at a glance
- Draw the one-screen stage on paper. Two silhouettes, a floor line, two walls, two health bars.
- Prompt WizardGenie for the input handler and the state machine: idle, walk, jab, heavy, hurt, KO.
- Cast walk and attack rows in Quick Sprites with the hero's costume tokens locked.
- Render two impact SFX in SFX Gen and one hit-stun beat.
- Wire the sprites into Phaser animations or your engine of choice, with hitbox and hurtbox rectangles as debug shapes.
- Playtest against yourself in mirror mode. Adjust frame data, not sprite polish.
- Stop.
Seven steps. If any single step slips into a full day, back up and ask what is actually blocking the loop.
One-screen stage rules
The camera is the first design decision in a 2d fighting game, not the last. A one-screen arena means the camera is fixed and both fighters have to share the frame at all times. That single constraint dictates hitboxes, dash distances, and stage width. Break it and the entire loop changes.
Pick the ratio for the platform you actually target:
- 16:9 for desktop and web browsers. Room for two fighters plus a small side gutter. Health bars live at the top corners.
- 4:3 for a retro grammar. Reads more grounded, less running space, more chip trades. Only pick this if the art also commits to CRT-era pixel proportions.
- 1:1 or 3:4 for mobile-portrait. Odd for the genre, but valid for a jam gimmick. Attacks need to be shorter horizontally, which changes the frame budget.
Ground rules that pay for themselves:
- Fighters have hard walls at the stage edges. Not "camera pushes"—actual solid rectangles. Corner pressure is a real fighting-game emotion and it comes from walls, not cinematography.
- The floor is a single collision line at a fixed y. No slopes, no platforms. If you want platforms, you are making a platformer, not a fighter, and there is a different 2D platformer walkthrough for that shape.
- Health bars are HUD, not world. Draw them in screen space so the camera cannot move them. Put both at the top, mirrored, with the player-1 name on the left.
- The dummy has the same silhouette rules as the hero. If you build the hero at 96 pixels tall, the dummy is 96 pixels tall. Different heights on pass one look like a proportion bug, not a design choice.
Fixed camera means the animation grammar can lean on sprite silhouettes rather than dynamic composition. That is a gift on a jam clock.
Attack and hurt frame budget
Fighting game design lives and dies by frame data. The good news for a jam scope: three cells per attack is enough to communicate a shape. The better news: two attacks means six unique attack sprites plus a small idle and walk cycle. That is a shippable cast.
Minimum viable frame inventory for the hero:
- Idle — 2 frames, alternating breath.
- Walk — 4 frames, forward loop. Reverse-play it for the back walk.
- Jab startup — 1 frame. Arm loading.
- Jab active — 1 frame. Arm out with the hitbox.
- Jab recovery — 1 frame. Arm returning.
- Heavy startup — 1 frame. Bigger tell, wider shoulder rotation.
- Heavy active — 1 frame. Arm all the way through with a longer hitbox.
- Heavy recovery — 1 frame. Vulnerable, still turning back.
- Hurt — 1 frame. Body flinched back.
- KO — 1 frame. Down on the floor.
That is fourteen unique sprite cells for the hero, doubled if the dummy needs its own rig. On the classic frame-data spreadsheet the jab reads as, roughly, 3 frames startup / 2 frames active / 6 frames recovery once you re-time in the engine—hitbox theory says the active window should be shorter than the startup so opponents can react. Whether or not you internalize that math on pass one, keep active-frame counts smaller than startup-frame counts and you will be inside the fighting-game grammar.
Do not budget in-between polish frames until the loop plays. A three-cell attack that reads clearly beats a twelve-cell attack no one has playtested. Save the polish sprites for a v2 pass after the tournament round works end-to-end.