A platformer is the canonical first game and historically the most painful one. The mechanics list reads like a pop quiz on physics — gravity, jump arcs, ground checks, AABB colliders, tilemap collision, hit-feel — and most beginners burn out somewhere between "install the engine" and "the player keeps falling through corners". AI agents now ship a playable Phaser project from a single sentence, run it in a browser tab, and let you fix the corners by chat instead of by editing every collider by hand.
How to make a platformer in five steps
The full workflow lives in one browser tab. No editor download, no project template, no per-engine quirks to learn. The five steps in order:
- Open WizardGenie in your browser. Pick the model the agent will run on (a frontier reasoner like Claude Opus 4.7 or GPT-5.5 is the right pick for the very first prompt).
- Describe the platformer in one paragraph. Genre, player verbs, world layout, win condition, scope. The agent writes a Phaser 4 project with gravity, jump, ground check, tilemap collision, and a sample level wired up.
- Run the build in the side preview pane. The first run is always rough — placeholder art, occasional collider glitches — and that is fine. The point is to confirm the loop exists.
- Iterate by chat. "Increase gravity, the jump feels floaty." "The wizard falls through corners — fix the AABB." "Add coins and a level 2 with vertical scroll." Each message is one round-trip with the agent, usually a couple of seconds on a cheap executor model.
- Swap in real assets without leaving the tab. Quick Sprites for the player and enemy sprite sheets, SFX Gen for jump and coin sounds, Music Gen for the level loop. The agent drops the Sorceress URLs into the project’s asset folder for you.
Total time to a playable first build is usually fifteen to thirty minutes. A small two-level platformer with real art and a soundtrack lands in roughly an afternoon. The work that comes after — pacing, balance, hit-feel, polish — is the part where you stop typing prompts and start playing the game.
What a platformer actually needs (mechanically)
Before talking to the agent it helps to know what a platformer is, mechanically. Platform games as a genre go back to the late 1970s and the mechanical recipe has barely changed: a controllable character that runs and jumps across a structured world, with hazards and goals. Underneath that simple description sits a stack of subsystems every modern Phaser platformer wires up:
- Gravity. A constant downward acceleration applied to the player every frame. Phaser exposes this as
this.physics.world.gravity.y. Real-feeling platformers usually run between 800 and 1500 — too low and the character floats, too high and the jump feels stiff. - Jump impulse. A negative-Y velocity applied on the jump button. Around
-450is the canonical starter value for a Phaser sprite at 32–48 px tall, but the right number is the one that makes your levels feel right. - Ground check. A test that returns true when the player is touching a solid surface, so the jump button only fires when standing. Implementations range from a one-pixel collision overlap at the player’s feet to a downward raycast.
- AABB collider. An axis-aligned bounding box that handles physics overlap with the world. Phaser’s Arcade Physics wraps this so most of the time you tweak
setSize()to match the visible sprite rather than write the math yourself. - Tilemap collision. The ground, walls, and platforms are usually a tilemap with a "collide" flag on solid tiles. The agent generates a JSON tilemap and the loader code; you edit the tile grid by chat ("add three floating platforms above the chest").
- Side-scrolling camera. A camera that follows the player horizontally (and sometimes vertically) and only renders the visible chunk of the level. Phaser’s
this.cameras.main.startFollow(player)is one line. - Hit, death, and respawn. When an enemy or hazard touches the player, what happens? Lose a heart, knockback, brief invulnerability, respawn at a checkpoint. This is where games gain or lose feel.
You don’t have to write any of these by hand. You do have to know they exist, because that’s the vocabulary you use to describe what’s wrong. "The jump feels floaty" is fuzzy. "Increase gravity from 800 to 1100 and shorten the jump impulse to -400" is a single chat message that the agent will land on the first try.
The five-minute version: prompt to playable
The first prompt is the most important decision in the whole workflow. A good first prompt locks the genre, the core verbs, the world layout, the visual style, and the scope in one paragraph. A bad first prompt produces a generic "here is a Phaser starter" the agent then spends an hour reshaping into your idea.
The shape that works for a platformer:
Make a 2D side-scrolling platformer in Phaser 4. The player is a small
wizard who walks left and right with the arrow keys and jumps with
spacebar. Three levels of increasing length, side-scrolling camera that
follows the wizard. Each level has slime enemies that walk a fixed
patrol path and damage the wizard on contact, coins to collect, and a
goal flag at the right edge. Pixel-art look, 32x32 tiles, 48x48 wizard
sprite. Variable jump height (hold spacebar for higher), coyote time of
about 100ms, jump buffering of about 100ms. Three hearts of health,
1-second invulnerability after each hit. Make it actually playable, not
just a render loop.
Notice what’s in there: genre (side-scroller), engine (Phaser 4), input (arrow keys + spacebar), enemy behavior (patrol, damage on contact), pickups (coins), win condition (goal flag), explicit scope (three levels), visual style (pixel art, exact tile and sprite sizes), feel parameters (variable jump, coyote time, jump buffering), HP system, and "actually playable" as a tag to nudge the agent into wiring up real input and a real game-over state. What’s not in there: model picking, file structure, framework version. The agent handles all of that.
About thirty to ninety seconds after sending the prompt, the agent returns a file tree. Something like:
index.html
package.json
vite.config.js
src/
main.js
scenes/
BootScene.js
Level1Scene.js
Level2Scene.js
Level3Scene.js
HudScene.js
objects/
Wizard.js
Slime.js
Coin.js
assets/
placeholder-wizard.png
placeholder-slime.png
placeholder-tiles.png
level-1.json
level-2.json
level-3.json
Resist the urge to read every file. Hit Run instead. WizardGenie launches the project in a side preview pane. The wizard is probably a colored square, the slimes might tunnel through walls, the camera might lag — that’s all normal. Confirm the loop runs, then go straight into the iteration phase.