Cabinet How to Make an Arcade Game (Browser Credit Loop 2026)

By Arron R.11 min read
How to make an arcade game in 2026: model a credit-and-lives state machine, wire attract mode into a 60-second play loop in WizardGenie, dress it with Quick Spr

Most beginners who search "how to make an arcade game" want the coin-op feel - attract mode with a blinking INSERT COIN, one credit that buys three lives, a 60-second high-tension loop, and a three-letter high-score table that survives a refresh - not a Neo Geo motherboard reverse-engineering project on day one. A commercial cabinet with a JAMMA harness, a CRT, and a locked bill validator is an electronics build. A browser arcade game is different. A coding agent scaffolds the attract-play-gameover state machine from one prompt, and AI generation covers the sprites, coin cues, and marquee theme. On desktop or web, that means WizardGenie for the credit-loop interpreter, Quick Sprites for the ship and enemy art, SFX Gen for coin, shoot, and death cues, and Music Gen for the marquee theme. This guide is the honest end-to-end for how to make an arcade game in 2026, as a weekend build you can actually finish.

How to make an arcade game browser pipeline: attract mode, credit loop, play state, and high-score table wired in WizardGenie
The 2026 how to make an arcade game recipe: attract mode invites a credit, credit buys three lives, play runs the loop, then the high-score table banks the run.

What how to make an arcade game actually means in 2026

The query "how to make an arcade game" hides three intents. Some searchers want to restore a physical cabinet - swap a broken CRT, replace a JAMMA harness, or wire a Raspberry Pi behind a MAME frontend - that is a hardware brief, not a playable browser loop. A second intent is a broader how to make a video game guide covering engines, art, and audio under one umbrella - useful, but too broad to answer the arcade-specific "one credit, three lives, one leaderboard" mental model. The intent this guide targets is the third: a browser arcade game that boots into an attract loop, waits for a coin, grants three lives, runs a tight 60-to-120-second core, and banks the run into a three-letter high-score table before returning to attract. That is a weekend build, it demos the Sorceress toolset, and it is the format most arcade game tutorial and html5 arcade game searchers actually want.

The presentation contract is small and strict. Attract mode shows the title, a rotating demo of the play loop, the current top three initials, and a blinking INSERT COIN hint. Pressing a coin key increments credits; pressing Start consumes one credit and grants three lives. Play mode shows a HUD with lives, score, and wave, plus a small pause indicator. Game Over shows the final score, a "NEW HIGH SCORE" flourish if the run cracked the top ten, and either an initials-entry prompt or a return to attract. The arcade game overview on Wikipedia (verified 2026-08-30) traces the format from mechanical amusements through 1970s coin-op video to modern digital cabinets, and confirms the credit-lives-score-leaderboard beats as the defining loop - cite that page in your itch.io blurb so players know you shipped a browser arcade game credit loop, not a two-hour narrative RPG.

The arcade browser credit loop in one minute (attract, credit, play, game over, initials)

Five moving parts, cycled forever. First, attract - the title screen loops a scripted demo of the play state at low input, cycles the top three high scores, and blinks INSERT COIN until credits rise above zero. Second, credit - a coin key press increments the credit counter and plays a short coin-drop cue; pressing Start decrements credits by one, resets score to zero, sets lives to three, and enters play. Third, play - the core mechanic runs on a fixed frame budget: escalating waves, incremental score awards, and a life decrement on each fatal hit. Fourth, game over - when lives reach zero, freeze input, fade the HUD, and show the final score with a two-second pause. Fifth, initials entry - if the run cracked the top ten scoreboard, prompt for three letters, save the entry to localStorage, and return to attract; otherwise skip straight back to attract. That five-state cycle is the whole arcade game - everything else is polish on top.

Arcade browser credit loop state machine diagram showing attract mode, credit consumption, play state, game over, and initials entry
The arcade browser credit loop: attract waits for a coin, credit consumes one to grant three lives, play runs the core, game over triggers on last life, and initials entry banks a top-ten score.

Pick your engine for how to make an arcade game: Phaser, Canvas, or WizardGenie

Three good targets in 2026, each with a different trade-off. Vanilla Canvas is the honest default and the pick this guide recommends for a first build. One canvas element, one requestAnimationFrame loop, one state variable that swaps between attract, play, gameover, and initials. Each state has its own update and render function; the main loop dispatches to the current state. Convert pointer and key events to canvas coordinates with getBoundingClientRect and route them through the state input handler. The MDN Canvas API docs (verified 2026-08-30) cover everything you need for an html5 arcade game prototype in under 300 lines including a state machine, HUD rendering, and a localStorage-backed scoreboard.

Attract mode versus a static title matters more than beginners realize. A static "Press Start" screen reads as unfinished - even a five-second scripted play demo tricks the eye into believing there is a real game behind the marquee. Reuse the play state at low input intensity: spawn one enemy wave, let a pretend AI ship dodge for a few seconds, then explode on purpose. That single trick is what makes a browser arcade game feel like a cabinet instead of a wireframe.

Phaser v4.2.1 "Giedi" (released 9 July 2026, verified 2026-08-30 on the official Phaser stable download page) becomes the right pick if you want Scene stacks per state (AttractScene, PlayScene, GameOverScene, InitialsScene), tweened sprite motion, a physics-arcade body for shmup or breakout variants, or a camera that shakes on death. Phaser does not invent your credit rule - you still need the same credits-and-lives state machine. Use Phaser when Scene stacks and physics arcade are the product; use raw Canvas when the product is an arcade game tutorial people can read in one sitting. A phaser arcade game campaign is a fine v2 once the Canvas prototype proves the loop feels right.

WizardGenie is not a separate arcade engine - it scaffolds whichever of the two you pick from a single natural-language prompt. WizardGenie ships as both a desktop app (Windows installer with auto-update, available to Early Access supporters and above) and a no-install web build. Its coding-model lineup 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 (verified 2026-08-30 in src/app/_home-v2/_data/tools.ts). For a first arcade credit loop, any frontier model scaffolds the attract-play-gameover state machine in one prompt. Pair a frontier planner with a budget executor like DeepSeek V4 Pro or Kimi K2.5 for the typing pass - the dual-agent pattern lands most projects at roughly one-fifth the single-frontier cost.

Step 1 - model credits, lives, score, and the scoreboard

Nothing else in the pipeline matters if the state machine drifts or the scoreboard loses a run on refresh. Start with a small, testable model:

const SCOREBOARD_KEY = "arcade.scores.v1";
const SCOREBOARD_MAX = 10;
const STARTING_LIVES = 3;

const game = {
  state: "attract",
  credits: 0,
  lives: 0,
  score: 0,
  wave: 1,
  initials: "AAA",
  pendingScore: 0,
};

function loadScores() {
  try {
    const raw = localStorage.getItem(SCOREBOARD_KEY);
    return raw ? JSON.parse(raw) : [];
  } catch { return []; }
}

function saveScores(list) {
  localStorage.setItem(SCOREBOARD_KEY, JSON.stringify(list));
}

function insertScore(initials, score) {
  const list = loadScores();
  const stamp = Date.now();
  list.push({ initials, score, at: stamp });
  list.sort((a, b) => b.score - a.score);
  const trimmed = list.slice(0, SCOREBOARD_MAX);
  saveScores(trimmed);
  return trimmed.findIndex(row => row.at === stamp);
}

function isTopTen(score) {
  const list = loadScores();
  if (list.length < SCOREBOARD_MAX) return true;
  return score > list[list.length - 1].score;
}

function insertCoin() {
  game.credits += 1;
  playSound("coin");
}

function startGame() {
  if (game.credits <= 0) return;
  game.credits -= 1;
  game.lives = STARTING_LIVES;
  game.score = 0;
  game.wave = 1;
  game.state = "play";
}

function loseLife() {
  game.lives -= 1;
  playSound("death");
  if (game.lives <= 0) {
    game.pendingScore = game.score;
    game.state = isTopTen(game.score) ? "initials" : "gameover";
  }
}

Unit-test four cases before you generate any art: pressing the coin key raises credits and does nothing else; pressing Start with zero credits stays in attract; pressing Start with credits above zero decrements credits, sets lives to three, and enters play; and calling loseLife three times routes to initials if the score qualifies or gameover otherwise. Those four tests catch ninety percent of javascript arcade game bugs. Keep the scoreboard length fixed at ten - a growing table is a debug tool, not a design.

Step 2 - wire attract mode and the credit loop in WizardGenie

With the state machine drafted, open WizardGenie. Drop in a bare index.html shell that loads a 480x640 portrait canvas (arcade cabinets are tall), the state model from step one, and a Reset button. Give the agent one paragraph: Build a browser arcade game. Model four states - attract, play, gameover, initials. In attract, loop a five-second scripted play demo at low intensity, cycle the top three scores from localStorage, and blink INSERT COIN. On coin key (press C) increment credits. On Start (press Enter) with credits above zero, decrement credits by one, set lives to three, and enter play. Play runs a top-down single-screen shooter: player at the bottom, waves of enemies scroll from the top, one-hit death, wave counter increments every 15 seconds. On last life advance to gameover; if the score is in the top ten, route to initials entry. In initials, let the player roll three letters with arrow keys and press Enter to bank. Return to attract. Persist scores to localStorage. Feed that to any coding model in the lineup and the interpreter scaffolds in under ten minutes.

The remaining hour is polish via follow-up prompts. Add a marquee glow - a soft radial gradient behind the title in attract mode - eight lines. Add a camera shake on death - three lines. Add a wave banner - a two-second overlay reading "WAVE 3" that fades out - ten lines. Add an extra life at 10,000 points - one conditional inside the score-award path. Each item is a follow-up prompt, and the whole arcade game credit loop comes together over a Saturday afternoon.

Optional siblings: if your jam wants a grid-based arcade classic instead, borrow the tile-collision loop from how to make Space Invaders. For a paddle-and-brick variant of the same credit loop, see the flipper timing in how to make a pinball game. For a dodge-heavy shmup on the same credit shell, see how to make a shmup.

Persist high scores with the MDN localStorage API (verified 2026-08-30) so a refresh still shows the player's ten best runs. Keep the save payload tiny: initials, score, and an epoch timestamp - not a full replay buffer.

Step 3 - Quick Sprites art, SFX Gen cues, and a Music Gen marquee theme

A wireframe canvas reads as a tech demo even when the state machine is perfect. Three asset passes cover the whole html5 arcade game experience:

  • Player and enemy sprites - Quick Sprites generates pixel-art sprite sheets from a text prompt at 9 credits per generation (CREDITS_PER_GEN in src/app/quick-sprites/page.tsx). Prompt one sheet for the player ("small chunky pixel-art blue starfighter, 4-frame idle animation, no background") and one for the first enemy wave ("small red pixel-art alien, 4-frame drift animation, no background"). Two generations at 9 credits each = 18 credits. A boss-wave sprite is a fine third pass in a v2 build.
  • SFX cues - open SFX Gen and describe six clips in plain language: "short bright coin-drop chime", "short laser pew on player shoot", "muted metallic thud on enemy hit", "descending crunch on player death", "rising fanfare on extra life", "descending fanfare on game over". Billing is roughly 1 credit per second of generated audio per src/app/sfx-gen/page.tsx - six short clips land around 8 credits total. Mute by default with a toggle - mobile browsers often block autoplay until the first input anyway.
  • Marquee theme - open Music Gen and prompt one 30-to-60-second loopable chiptune track: "upbeat 8-bit arcade marquee theme, 130 BPM, catchy hook, loopable, no vocals". One track costs 10 credits per MUSIC_CREDIT_COST in src/app/music-gen/page.tsx. Loop it in attract; fade to a lower-intensity variant when play starts, or drop it entirely for a pure-SFX play loop.

Load sprites as regular Image objects and slice frames with source-rectangle drawImage calls - the same pattern you would use for any browser puzzle game or shmup. Do not chase a "perfect" first sprite - a second Quick Sprites retry is cheap, but three retries per subject is a signal to change the prompt, not the seed.

Arcade game asset stack diagram showing Quick Sprites player and enemy, SFX Gen cues, Music Gen marquee theme, roughly 36 credit total
The arcade asset stack: Quick Sprites for player and enemy waves, SFX Gen for coin, shoot, hit, and death cues, Music Gen for the marquee theme - roughly 36 credits total.

Step 4 - playtest the browser arcade game like a jam judge

Before you share the build, run a five-minute checklist borrowed from arcade-jam judging:

  1. Attract earns its slot - the scripted demo shows the play state, not a static screenshot; the top three scores actually update after a run.
  2. The credit rule is honest - you cannot start with zero credits; each Start consumes exactly one credit; extra credits queue rather than reset.
  3. Difficulty ramps inside 60 seconds - wave 1 is beatable by a first-time player; wave 3 kills most first-time players; wave 5 is a boast.
  4. Game over is celebratory, not silent - the death cue plays, the HUD dims, and the final score sits on screen long enough to read.
  5. Initials entry is one-hand friendly - arrow keys roll a letter, Enter confirms; no mouse, no typing. Backspace or Left arrow lets a nervous player fix a typo.

Log issues as WizardGenie follow-ups, not rewrites. "Extend the initials-entry timeout to twenty seconds" is one prompt. "Add a screen flash on player death" is another. The Sorceress tools guide lists every asset tool if you want to swap Quick Sprites for a hand-drawn spritesheet or replace Music Gen with a licensed chiptune later - the credit-loop code does not change.

What how to make an arcade game costs on Sorceress in 2026

An honest budget for the stack above against the 2026 Sorceress rate card (verified 2026-08-30 against local source):

  • Two Quick Sprites generations (player + first enemy wave) at 9 credits each: 18 credits (0.18 USD)
  • Six SFX Gen clips (~8 seconds total): ~8 credits (0.08 USD)
  • One Music Gen marquee theme at 10 credits per track: 10 credits (0.10 USD)
  • Coding-model API time with planner + budget executor: under 0.40 USD

Total roughly 36 credits or 0.36 USD in generation, plus a small model bill. The free 100-credit signup grant covers this build outright, with headroom for a boss-wave sprite or a stage-2 music track. Lifetime Early Access sits at 49 USD (LIFETIME_PRICE in src/app/plans/page.tsx) if you want desktop WizardGenie with auto-update for the next jam. Credits convert at 100 per dollar (CREDITS_PER_DOLLAR in src/lib/models.ts). Adding a boss sprite plus a second-stage music track lifts the total to about 55 credits or 0.55 USD, still well under the two-dollar ceiling this guide targets.

That is the whole path for how to make an arcade game as a browser credit loop in 2026: model credits, lives, and score as a four-state machine on Canvas, let WizardGenie scaffold the attract-play-gameover flow from one prompt, dress the marquee with Quick Sprites art, SFX Gen cues, and a Music Gen theme, and ship the cabinet before the weekend ends. When you are ready for combos, continues, or a stage-select carousel, graduate slowly - but finish one honest credit loop first.

Frequently Asked Questions

What defines an arcade game as a genre in 2026?

An arcade game is a coin-operated (or credit-metered) short-session game built around a tight replayable loop, escalating difficulty, and a public high-score table. The Wikipedia arcade game entry (verified 2026-08-30) traces the format from mechanical amusements through the 1970s video boom to modern digital cabinets. A browser arcade game replaces the coin slot with a virtual credit but keeps the same beats: attract mode invites you in, one credit buys three lives, difficulty ramps for 60-120 seconds, then the initials prompt banks your run into the leaderboard. Anything longer than a five-minute run and you have drifted into a different genre.

Phaser or vanilla Canvas for a first browser arcade game?

Vanilla Canvas is the honest default for a first how to make an arcade game tutorial - one canvas element, a requestAnimationFrame loop, four small state functions (attract, play, gameover, initials), and a scoreboard array in localStorage. Phaser v4.2.1 Giedi (released 9 July 2026, verified 2026-08-30 on phaser.io/download/stable) is the right pick when you want Scene stacks per state, tweened sprite motion, or a physics-arcade body for a shmup or breakout variant. Pick Canvas when the product is a readable arcade game tutorial; pick Phaser when the state stack and physics arcade features are the product.

How should the credit and lives system actually work?

Keep the state model embarrassingly small on the first build. Two numbers: credits (starts at 0, incremented when the player presses the coin key), and lives (set to 3 when a credit is consumed to start a game). Attract mode waits for credits to be greater than zero; pressing Start decrements credits by one and enters play. Each death decrements lives; when lives hits zero, the game state advances to Game Over and then to Initials Entry if the run cracked the top ten. Bank the entry, reset lives, and return to Attract. Add continues, extra-life thresholds, or free-play toggles only after that loop feels honest.

How does a browser arcade high-score table work without a server?

For a first browser arcade game, use the localStorage API to keep a ten-row scoreboard as JSON on the player's device. Each row stores initials (three letters), score, and epoch timestamp. On game over, sort descending, insert the new run at its rank, truncate to ten rows, and stringify back into localStorage. The MDN localStorage docs (verified 2026-08-30) confirm the value is persisted per-origin across sessions - plenty for a jam build. Move to Supabase, PlayFab, or a small POST endpoint only when you actually want cross-device leaderboards - not on day one.

How much does building an arcade game on Sorceress cost in 2026?

A first-project browser credit loop budgets like this against the 2026 Sorceress rate card (verified 2026-08-30 against local source). Two Quick Sprites generations for the player ship and one enemy wave at 9 credits each = 18 credits. Six SFX Gen clips (coin insert, shoot, hit, death, extra life, game over) at roughly 1 credit per second = around 8 credits. One Music Gen marquee theme at 10 credits per track. Coding-model API time under 0.40 USD with a planner plus budget executor. Total roughly 36 credits or 0.36 USD in generation. The free 100-credit signup grant covers the whole build. Adding a boss-wave sprite and a stage-2 music track lifts the total to about 55 credits, still under 60 cents.

Sources

  1. Arcade game - Wikipedia
  2. Phaser v4.2.1 Giedi download
  3. MDN - Canvas API
  4. MDN - localStorage
Written by Arron R.·2,581 words·11 min read

Related posts