Most "make a game" tutorials start with an hour of downloading art. This one doesn't. You'll draw two coloured squares, place them, and wire up eleven blocks — and you'll end with a real game: red squares rain down, you slide left and right to survive, your score climbs, and hitting one starts you over. Everything happens on your phone in Max2D, free on Google Play. Set a timer.
Download ColourDodge.zip (2 KB)
To open it: Max2D → Projects → Import Project → pick the file. The project takes its name from the zip, so leave the filename alone.
Minute 1: The project and two squares
- Make a new projectOpen Max2D, Create tab, new project. Call it Colour Dodge. Leave the first scene named scene1.
- Draw the player squareOpen the sprite editor, fill a 64 × 64 canvas with blue, and save it as player. Solid colour, no detail — that's the whole point.
- Draw the danger squareSame again in red, saved as block. Red reads as danger without a single word of explanation, which is a real design decision doing real work.
Prefer real art? Open the Asset Store inside Max2D for ready-made sprites, or import any image from your gallery. Every step below is identical either way, and the art can be swapped at any time.
Minute 2: The player
Tap + and choose Sprite, name it exactly player, and place it near the bottom of the view. Give it three components:
| Component | Settings | Why |
|---|---|---|
| Sprite | your blue square | What you see |
| Rigidbody | dynamic, gravity scale 0, fixed rotation on | Slides sideways, never falls, never spins |
| Box Collider | 64 × 64 | What the red blocks hit |
Two of those settings are the difference between a game and a mess. Gravity scale 0 is why the player doesn't drop off the bottom of the screen. Dynamic rather than kinematic is subtler: a kinematic body ignores walls entirely and would slide straight off the edge. Dynamic bodies get stopped by things, which is what you want.
Minute 3: Controls, in three tiny chains
Open the player's script. You're adding three separate chains, none of them connected to each other:
- Slide leftWhen Screen Touched (event Touch Down, location Left) → Move (Velocity) with linear x = −260.
- Slide rightWhen Screen Touched (Touch Down, location Right) → Move (Velocity) with linear x = 260.
- Stop on releaseWhen Screen Touched (event Touch Up, location Whole) → Move (Velocity) with linear x = 0.
Leave every other field on those Move blocks as NaN. NaN means "don't touch this property", so these blocks only ever change horizontal speed and leave everything else alone.
That's your entire control scheme: touch a side of the screen, go that way; let go, stop. The location dropdown on the touch event does all the work — no maths, no joystick, no dead zones.
Name it wall, give it a static Rigidbody and a tall Box Collider (about 40 × 700), and place it just off the left edge. Then duplicate it for the right edge. Invisible but solid.
Minute 4: The falling block
Now the only genuinely interesting object in the game. Tap + → Sprite, name it exactly block, give it your red square, a kinematic Rigidbody and a 64 × 64 Box Collider, and place it above the top of the view. Kinematic means it moves exactly how you tell it and nothing pushes it around.
Its script is five blocks in one chain:
- On PlayRuns every frame.
- Move (Velocity)Linear y = −150. Negative is downward. Everything else NaN.
- If (True/False)Expression
position_y < -320— "have I fallen past the bottom?" - Change Position/Size, on the true branchSet position y = 320, leave position x, both scales and angle as NaN. This teleports the block back above the top of the screen.
- Set VariableThis block has three fields, and the order matters. Set scope to global first, then pick variable → score, then open the num value dropdown, choose Expression solver, and enter
score + 1. A block that got past you is a point earned.
{expression} instead of a number. That's how score + 1 goes into num value, and how score goes into the score label's text field later.
One trap on Set Variable: changing scope clears whatever variable you had chosen, because the variable list is filtered by scope. Always set scope first, or you'll wonder why the dropdown went blank.
Those five blocks are what makes the game endless. Nothing is ever created or destroyed — ten blocks fall forever in a loop, and the scoring is a free side effect of the recycling.
position_y and the Change Position/Size block use world coordinates, where up is positive. So a block placed at editor y = −300 sits above the screen, and sending it back there means setting y = 320. If your blocks vanish instead of looping, flip that sign first.
Minute 5: Duplicate, then finish
- Copy the block across the screenDuplicate it nine times and spread the copies horizontally. Duplicating carries the script with it, so this is nine taps, not nine scripts.
- Stagger their heightsDrag each copy to a different height above the screen. This is what turns a wall of blocks into a rain of them.
- Give each one a different speedChange the Move block's linear y on each copy: −130, −160, −190, −145, and so on. Identical speeds mean the blocks stay in formation forever; different speeds mean the gaps keep changing and the game never plays the same way twice. This is the single highest-value minute in the build.
- Add the fail stateBack on the player's script, a fourth chain: On Play → Is Colliding With (object block) → from the blue true port → Load Scene set to scene1. Reloading the current scene is the cheapest restart there is.
- Show the scoreTap + → Text and place it at the top with a two-block script: On Play → Set Text. In the Set Text block, open the text field's dropdown, choose Expression solver and enter
score. Type it as plain text instead and your label will proudly display the word "score" forever.
Now play it
Press play. Blocks fall, you slide, the number climbs, and a red square ends the run. That's a game — a loop with a goal, a skill, and a consequence.
If something's off, it's almost certainly on this list:
| Symptom | Cause |
|---|---|
| Player falls off the bottom | Gravity scale isn't 0 |
| Player slides off the side | Walls missing, or the player is kinematic instead of dynamic |
| Blocks fall once and never come back | Reset y is negative — it should be positive (see the coordinates note) |
| Blocks pile up at the bottom | They're dynamic instead of kinematic, so they're colliding with each other |
| Score jumps by dozens | The If block is wired to the wrong port, so it fires every frame instead of once |
| Nothing kills you | Object name typo — the Is Colliding With block needs exactly block |
| Player spins when hit | Fixed rotation is off |
| Score stays at 0 | Set Text has plain text instead of an Expression solver value |
| Set Variable's variable dropdown is empty | The score variable doesn't exist yet, or scope was changed after picking it (which clears it) |
Five more minutes, five better games
You now have a skeleton worth reusing. Each of these is a small change to what you just built:
- Catch instead of dodge. Make the blocks green, and swap the Load Scene on collision for a Set Variable that adds points. Same objects, opposite goal.
- Speed ramp. Change a block's speed to an expression like
-150 - score * 2so the game accelerates as you get better. - Two colours. Duplicate the block, tint it green, and give it the scoring behaviour while red keeps the killing behaviour. Now the player has to make decisions instead of just avoiding things.
- Lives. Add a
livesvariable, subtract one on a hit instead of restarting, and only load the scene when it reaches zero. - Sound. One Play Sound block on the hit chain does more for the feel of the game than any visual change of the same size.
When you want the next step up — real physics, animation, a saved high score and a second screen — build Flappy Bird. It's the same ideas with more of them. If you'd rather describe a game and have it built for you, see making a game with AI, and if you're weighing up tools first, start with making a game without coding.
Frequently asked questions
Can I really make a game in five minutes?
If the game is small, yes. This one is fourteen objects and eleven blocks, and eleven of those objects are duplicates of one you build once. Five minutes buys you a finished, playable loop with scoring and a fail state — not a polished product.
Do I need to download any art?
No. The sprite editor is built in, so a solid coloured square takes about ten seconds. Two squares is the whole art budget. You can swap in real sprites later without touching any of the logic.
Why does my player fall off the bottom of the screen?
Gravity scale isn't 0. This player only slides sideways, so it wants a dynamic body with gravity scale 0 and fixed rotation on. Dynamic matters too — a kinematic body ignores the side walls and slides off the edge.
How do I make it harder?
Raise the falling speed on some blocks, add more blocks, or slow the player down. Because each block carries its own speed, varying that number is the cheapest way to stop the pattern repeating.
What should I build after this?
Reuse the same three ideas in a new shape: an event chain per input, a moving object that recycles, and a variable that counts. A catch game, a lane runner and a simple shooter are all this skeleton wearing different clothes.
Five minutes from now you could be playing it
No PC, no art, no code. Free on Google Play.