⭐ My First Video Game · Series 1 · Episode 5 of 6
🏎️ Ep 1 · Zoom Zoom 🍄 Ep 2 · Jump Jump 🔫 Ep 3 · Bang Bang 🧚 Ep 4 · Fairy Survivors 🦍 Ep 5 · Barrel Blast 🗡️ Ep 6 · Pixel Quest
🔧 Godot Workshop · Parent & Child
⭐ My First Video Game

Barrel Blast! 🦍Build Your Own Donkey Kong-Style Game

Dodge rolling barrels, climb ladders, and reach the top to win! You'll build a climbing arcade game just like the original Donkey Kong one of the greatest games ever made!

🧒 Age 6+ with a grown-up ⏱️ About 1–2 hours 🎮 Godot 4 (free!) ✨ 12 fun steps
🦍
0 XP
Level 1
🔥0
📦 Starter Template
📦
Starter Template Available — open it alongside this workshop! Pre-built Godot 4 project — hero, boss, rolling barrels, 4 girder platforms, and win/game-over states all ready.
⬇ Download Free
🛢️ Workshop Progress 0 / 12 steps
1
🌟
▶ Current
Welcome, Arcade Maker!
A big hello before we start climbing!
▶ Current
🎯
Goal for this step

Understand what we're building and get Godot open and ready!

🧒 For the child

We're going to make a game like the VERY FIRST arcade games ever made! There's a big gorilla at the top throwing barrels, and your little hero has to dodge them and climb all the way up. It's going to be SO much fun and YOU are going to build it! 🦍🛢️

👨‍👩‍👧 For the grown-up

Episode 5 of My First Video Game. Core new concepts: ladder climbing via Area2D overlap (disabling gravity), barrel spawning using a Timer node, and rolling barrels as CharacterBody2D with constant horizontal velocity that flips on collision. The girder level is built with StaticBody2D rectangles whichever the child finds easier to paint.

👨‍👩‍👧
Grown-up note: Purple boxes are just for grown-ups! The child can do most of the typing your job is to read together and celebrate every step. This episode is slightly more complex than Jump Jump, but the payoff is huge kids LOVE seeing barrels roll! 🛢️
✏️
Fill in the Blanks
+15 XP
The classic game that inspired ours is called . We will build it in the free game engine called .
🧠
Knowledge Check
+15 XP
What does the big boss at the top of the level do in our game?
AIt collects coins for the hero
BIt throws barrels down for the hero to dodge
CIt builds the ladders
2
📁
🔒 Locked
New Project — Barrel Blast!
A fresh start for our arcade adventure!
🔒 Locked
🎯
Goal for this step

Create a new Godot 4 project called "Barrel Blast" and get it open.

🧒 For the child

Every game starts the same way with a brand new empty project! It's like opening a fresh box of LEGOs. Let's set ours up so we can start building our arcade game!

👨‍👩‍👧 For the grown-up

Standard Godot 4 new project. Compatibility renderer, Desktop platform. This time we'll set the window size to 480×640 in Project Settings to give a tall arcade-style aspect ratio — optional but fun.

What to do:

  1. 1Open Godot 4 and click "New Project".
  2. 2Name it Barrel Blast. Choose a folder on your Desktop.
  3. 3Make sure Renderer is set to Compatibility.
  4. 4Click "Create & Edit".
  5. 5Optional: Go to Project → Project Settings → Display → Window and set Width: 480, Height: 640.
🕹️
Try it! Can you find where to change the window size? Go to Project → Project Settings → Display → Window and try setting Width to 480 and Height to 640. Arcade style!
🔢
Put It In Order
+15 XP
Click these steps in the correct order to make a new Godot project:
Click "Create & Edit" to open the project
Click "New Project" in the Godot Project Manager
Name it "Barrel Blast" and pick a folder
🧠
Knowledge Check
+15 XP
Which renderer should you choose for this beginner project?
ACompatibility
BForward+ Ultra HD
CIt doesn't matter, there is only one
3
🧑
🔒 Locked
Build the Hero
The brave little character who climbs to the top!
🔒 Locked
🎯
Goal for this step

Create a Hero scene with running, jumping, and gravity just like Jump Jump!

🧒 For the child

Remember Jump Jump? We're going to build a character the same way a CharacterBody2D who can run and jump. If you did Jump Jump already, this will feel very familiar! If not, don't worry we'll go through it together.

👨‍👩‍👧 For the grown-up

Identical setup to Jump Jump: CharacterBody2D → Sprite2D + CollisionShape2D (RectangleShape2D). Add the hero to a "player" group. Gravity constant + jump on ui_accept + horizontal movement with get_axis. Save as hero.tscn. We'll add ladder logic in Step 5.

What to do:

  1. 1Click Scene → New Scene. Root node: CharacterBody2D. Rename it Hero.
  2. 2Add child: Sprite2D (give it a bright colour!).
  3. 3Add child: CollisionShape2D set Shape to RectangleShape2D.
  4. 4In the Node tab, click Groups and add: player.
  5. 5Attach a script and type the code below. Press Ctrl+S, save as hero.tscn.
extends CharacterBody2D

const SPEED      = 200
const JUMP_FORCE = -440
var gravity = ProjectSettings.get_setting("physics/2d/default_gravity")
var on_ladder  = false  # We'll use this in Step 5!

func _physics_process(delta):
    # Gravity (skip when on a ladder)
    if not is_on_floor() and not on_ladder:
        velocity.y += gravity * delta

    # Jump
    if Input.is_action_just_pressed("ui_accept") and is_on_floor():
        velocity.y = JUMP_FORCE

    # Left / right
    var dir = Input.get_axis("ui_left", "ui_right")
    velocity.x = dir * SPEED

    move_and_slide()
🕹️
Try it! Run the game with F5 can your hero run left and right and jump? Good! We'll add the floor next.
💻
Code Challenge
+20 XP
Fill in the blanks to make the hero jump only when standing on the floor:
if Input.is_action_just_pressed("") and : velocity.y = JUMP_FORCE
💡 Hint: The jump action is "ui_accept" and we only jump when the hero is on the floor.
✏️
Fill in the Blanks
+15 XP
A character that moves and collides in Godot uses the node type . We add the hero to a group called so other objects can recognise it.
🧠
Knowledge Check
+15 XP
What does move_and_slide() do in the hero script?
AIt saves the game
BIt draws the hero's sprite
CIt actually moves the body using its velocity and handles collisions
4
🏗️
🔒 Locked
Build the Girder Level!
Stack up the platforms like a real arcade game!
🔒 Locked
🎯
Goal for this step

Create a Main scene with girder platforms the hero can stand and walk on.

🧒 For the child

In Donkey Kong, the hero walks on these wide metal floors called girders. We're going to build ours! We'll stack them up going from left to right, right to left — like a zig-zag staircase going upward.

👨‍👩‍👧 For the grown-up

Create main.tscn with a Node2D root. Simplest girders: add several StaticBody2D nodes, each with a CollisionShape2D (RectangleShape2D) and a Sprite2D/ColorRect as a visual. Stack 4–5 at different heights, alternating left/right. Instance hero.tscn at the bottom-left. Add a Camera2D as a child of the hero.

👨‍👩‍👧
Grown-up note: Donkey Kong's iconic zig-zag girder layout can be approximated with 4 girders: bottom-left long, middle-right long, upper-left long, top-right short. Each one a little higher than the last. Don't overthink the art coloured rectangles work perfectly for now!

What to do:

  1. 1Click Scene → New Scene. Root: Node2D. Save as main.tscn.
  2. 2Add a child StaticBody2D. Inside it, add CollisionShape2D (wide RectangleShape2D) and a ColorRect for the visual (brown is great!).
  3. 3Duplicate this girder 3–4 times. Move them to different heights zig-zag them left and right.
  4. 4Drag your hero.tscn into the scene. Place them above the bottom girder.
  5. 5Open hero.tscn and add a Camera2D child. Set Zoom to x:2, y:2.
  6. 6Press Ctrl+S then F5 to test!
🕹️
Try it! Press F5. Does your hero land on the bottom girder? Try walking to the edge do they fall off? Perfect!
True or False?
+15 XP
Girders are the solid platforms the hero stands and walks on.
A StaticBody2D is a good choice for a platform that never moves.
Adding the Camera2D as a child of the hero makes the camera stay still while the hero moves away.
🧠
Knowledge Check
+15 XP
Why do we make the Camera2D a child of the hero?
ASo the hero can't move
BSo the camera follows the hero around the level
CSo the girders stay still
5
🪜
🔒 Locked
Add Ladders to Climb!
The secret to getting to the top!
🔒 Locked
🎯
Goal for this step

Build a Ladder scene when the hero touches it, they can climb up and down!

🧒 For the child

The most special thing in our game is the LADDERS! When you walk into a ladder and press UP or DOWN, you climb! We're going to turn off gravity while climbing so it's like the ladder is holding you up.

👨‍👩‍👧 For the grown-up

Ladder scene: Area2D → Sprite2D (tall thin rectangle) + CollisionShape2D. In the hero script we detect body_entered/body_exited from the ladder's Area2D. When on_ladder is true, gravity is skipped and vertical velocity comes from ui_up/ui_down. Set the Area2D's collision layer/mask so only the hero detects it.

👨‍👩‍👧
Grown-up note: The ladder detection pattern here is classic for 2D arcade games. Key detail: when the player leaves the ladder (body_exited), reset on_ladder = false AND reset velocity.y to 0 to prevent stored upward momentum carrying them off.

What to do:

  1. 1Create a New Scene. Root: Area2D. Rename it Ladder.
  2. 2Add a Sprite2D (tall thin coloured rectangle) and a CollisionShape2D to match.
  3. 3Attach the script below to the Ladder's Area2D.
  4. 4Connect body_entered and body_exited signals in the Node tab.
  5. 5Save as ladder.tscn. Place 2–3 ladders between your girders in main.tscn.
extends Area2D

func _on_body_entered(body):
    if body.is_in_group("player"):
        body.on_ladder = true

func _on_body_exited(body):
    if body.is_in_group("player"):
        body.on_ladder = false
        body.velocity.y = 0  # Stop carrying momentum off the ladder

# --- ADD this inside _physics_process in hero.tscn script ---
# (after the gravity block)
#    if on_ladder:
#        var climb = Input.get_axis("ui_up", "ui_down")
#        velocity.y = climb * SPEED * 0.7
🕹️
Try it! Walk your hero into a ladder and press Up. Do they climb? Press Down to go back. Now jump off do they fall normally again?
💻
Code Challenge
+20 XP
Fill in the blanks so the ladder only affects the hero and lets it climb:
func _on_body_entered(body): if body.is_in_group(""): body.on_ladder =
💡 Hint: We check the "player" group, and we turn climbing ON by setting on_ladder to true.
🔮
Predict What Happens
+15 XP
You set on_ladder = false when the hero leaves the ladder, but you forgot the line body.velocity.y = 0.

What happens when the hero climbs up and walks off the side of a ladder?
ANothing changes, it works perfectly
BThe game crashes immediately
CThe hero keeps the leftover upward speed and shoots up off the ladder
🧠
Knowledge Check
+15 XP
Why do we use an Area2D for the ladder instead of a StaticBody2D?
AArea2D detects when the hero overlaps it without blocking movement
BArea2D is the only node that can have a sprite
CStaticBody2D can't be coloured brown
6
🛢️
🔒 Locked
Make a Rolling Barrel!
Here comes the danger!
🔒 Locked
🎯
Goal for this step

Build a Barrel scene that rolls along girders, falls off edges, and disappears at the bottom.

🧒 For the child

Now for the EXCITING bit the barrels! 🛢️ We're going to make a barrel that rolls across the floor. When it reaches the edge, it falls down to the next girder and keeps rolling. Just like the real Donkey Kong!

👨‍👩‍👧 For the grown-up

Barrel scene: CharacterBody2D → Sprite2D (brown circle) + CollisionShape2D. In the script: constant horizontal velocity, gravity applied, move_and_slide(). When it hits a wall (is_on_wall()) it flips direction this handles the zig-zag layout. Add to "barrel" group. Use queue_free() when it goes below the screen.

👨‍👩‍👧
Grown-up note: The barrel flipping direction on is_on_wall() is an elegant trick it works without any raycasts because the girder walls stop the barrel and cause it to reverse. The child will find it magical to watch.

What to do:

  1. 1Create a New Scene. Root: CharacterBody2D. Rename it Barrel.
  2. 2Add Sprite2D (brown!) and CollisionShape2D (CircleShape2D works great!).
  3. 3In the Node tab, add it to the group: barrel.
  4. 4Attach the script below. Save as barrel.tscn.
extends CharacterBody2D

const ROLL_SPEED = 130
var gravity = ProjectSettings.get_setting("physics/2d/default_gravity")
var direction = 1  # Start rolling right

func _physics_process(delta):
    # Gravity — barrels fall too!
    if not is_on_floor():
        velocity.y += gravity * delta

    # Roll sideways
    velocity.x = direction * ROLL_SPEED

    move_and_slide()

    # Flip direction if hitting a wall
    if is_on_wall():
        direction *= -1

    # Disappear if it rolls off the bottom of the screen
    if position.y > 900:
        queue_free()
🕹️
Try it! Drag one barrel into the scene by hand and press F5. Does it roll? Does it flip when it hits the edge? Does it fall to the next girder? 🎉
💻
Code Challenge
+20 XP
Fill in the blanks to make the barrel flip direction when it hits a wall:
if : direction *=
💡 Hint: We check is_on_wall() and multiply direction by -1 to reverse it.
True or False?
+15 XP
Barrels fall because we apply gravity to them, just like the hero.
queue_free() removes the barrel from the game when it falls off the bottom.
A barrel that is never removed with queue_free() has no effect on the game's performance.
🧠
Knowledge Check
+15 XP
What makes the barrel reverse and roll the other way?
AA random number generator
BIt hits a wall (is_on_wall()), so we multiply direction by -1
CThe boss tells it to turn around
7
🦍
🔒 Locked
Add the Big Boss!
The gorilla at the top who throws everything!
🔒 Locked
🎯
Goal for this step

Place a Boss character at the top who throws barrels on a timer!

🧒 For the child

Every great game has a big bad boss! Our gorilla sits at the TOP of all the girders and throws barrels down at us. We're going to use something called a TIMER it tells Godot to throw a new barrel every few seconds. Uh oh!

👨‍👩‍👧 For the grown-up

Boss scene: Node2D → Sprite2D + Timer node. On the Timer's timeout signal, instantiate barrel.tscn at the boss's position and add it to the main scene. Set Timer wait_time to 2.5s, autostart true. @export var barrel_scene: PackedScene lets you assign barrel.tscn in the Inspector.

👨‍👩‍👧
Grown-up note: The Timer node is a lovely concept to introduce here it fires a signal on a schedule without any manual delta counting. Use @export to pass the barrel scene reference instead of hard-coded node paths keep it simple.

What to do:

  1. 1Create a New Scene. Root: Node2D. Rename it Boss.
  2. 2Add a Sprite2D make it big and scary! (Dark colour, large size.)
  3. 3Add a child Timer node. Set Wait Time: 2.5 and tick Autostart: on.
  4. 4Attach a script to the Boss node with the code below.
  5. 5Connect the Timer's timeout signal to the script.
  6. 6Save as boss.tscn. Place in main.tscn at the top.
  7. 7In the Inspector, drag barrel.tscn into the Barrel Scene slot.
extends Node2D

@export var barrel_scene: PackedScene

func _on_timer_timeout():
    if barrel_scene:
        var barrel = barrel_scene.instantiate()
        # Spawn barrel at the boss's feet
        barrel.global_position = global_position + Vector2(0, 40)
        # Add to the main scene so it interacts with everything
        get_parent().add_child(barrel)
🕹️
Try it! Place the boss at the top-right of your level. Press F5 does a barrel appear every few seconds? Watch it roll! 😄
💻
Code Challenge
+20 XP
Fill in the blanks so the boss creates a barrel and adds it to the scene:
var barrel = barrel_scene. barrel.global_position = global_position + Vector2(0, 40) get_parent().
💡 Hint: instantiate() makes a copy of the scene, and add_child(barrel) puts it into the level.
✏️
Fill in the Blanks
+15 XP
The node that fires a signal on a schedule is called a . When it runs out of time it sends a signal called .
🧠
Knowledge Check
+15 XP
What does setting the Timer's Autostart to on do?
AIt starts the whole game automatically
BIt deletes the barrel after one use
CThe Timer begins counting down as soon as the scene loads
8
💥
🔒 Locked
Barrels Hurt the Hero!
Getting hit means game over!
🔒 Locked
🎯
Goal for this step

Make the hero die (or lose a life) when a barrel touches them.

🧒 For the child

What happens when a barrel rolls into our hero? Right now nothing! We need to fix that. When a barrel touches the hero, we'll show a "Game Over" message. Watch out for those barrels! 🛢️💨

👨‍👩‍👧 For the grown-up

Add an Area2D to the Hero (HitBox) to detect overlaps with the "barrel" group. On collision, show a CanvasLayer "Game Over" label and call reload_current_scene() after a short delay. Or track lives (start at 3) for a friendlier feel.

👨‍👩‍👧
Grown-up note: A short delay before reload_current_scene() lets the child see the Game Over message instant restarts feel confusing. await get_tree().create_timer(1.5).timeout achieves this neatly.

What to do:

  1. 1Open hero.tscn. Add a child Area2D, name it HitBox.
  2. 2Add a CollisionShape2D to HitBox match it to the hero's size.
  3. 3Connect body_entered on HitBox to the hero script.
  4. 4In main.tscn, add a CanvasLayer → Label. Write "Game Over! 💥" — hide it by default.
  5. 5Add the code below to the hero script. Drag the label into the Game Over Label slot.
# ADD to hero.tscn script:

@export var game_over_label: Label
var dead = false

func _on_hit_box_body_entered(body):
    if body.is_in_group("barrel") and not dead:
        dead = true
        game_over_label.show()
        # Wait a moment then restart!
        await get_tree().create_timer(1.5).timeout
        get_tree().reload_current_scene()
🕹️
Try it! Let a barrel hit your hero on purpose. Does Game Over appear? Does the level restart?
🔮
Predict What Happens
+15 XP
You wrote the hit code, but you forgot the and not dead part — so it just checks if body.is_in_group("barrel").

A barrel overlaps the hero for several frames in a row. What happens?
ANothing different, it still only triggers once
BThe "Game Over" / restart can trigger over and over each frame they overlap
CThe barrel turns into the hero
💻
Code Challenge
+20 XP
Fill in the blanks to detect a barrel hit and show Game Over only once:
if body.is_in_group("") and not : dead = true game_over_label.show()
💡 Hint: We check the "barrel" group, and "not dead" stops it triggering more than once.
🧠
Knowledge Check
+15 XP
What is the job of the HitBox Area2D on the hero?
ATo detect when a barrel overlaps the hero
BTo make the hero jump higher
CTo draw the score on screen
9
🏆
🔒 Locked
Add the Win Condition!
Reach the top and save the day!
🔒 Locked
🎯
Goal for this step

Place a goal at the top of the level touch it to win!

🧒 For the child

Our game needs a way to WIN! We're going to put a big shiny prize at the top of all the girders. If you can dodge all those barrels and climb all the way up YOU WIN! 🌟

👨‍👩‍👧 For the grown-up

Reuse the Flag/Goal pattern: Area2D → Sprite2D (star/trophy) + CollisionShape2D. On body_entered with "player" group, show a "You Win! 🎉" CanvasLayer label. Optional: a 2s timer then load the next scene or celebrate.

What to do:

  1. 1Create a New Scene. Root: Area2D. Rename it Goal.
  2. 2Add Sprite2D (⭐ or 🏆 something exciting!) and CollisionShape2D.
  3. 3Attach the script below. Connect body_entered.
  4. 4Save as goal.tscn. Place it near the boss at the very top of the level.
  5. 5Add a CanvasLayer → Label in main.tscn: "You Win! 🎉" hidden by default.
extends Area2D

@export var win_label: Label

func _on_body_entered(body):
    if body.is_in_group("player"):
        win_label.show()
🕹️
Try it! Climb all the way to the top past the barrels and touch the goal. Did you win? Show someone that's a real arcade game! 🎉
🔢
Put It In Order
+15 XP
Click these in the correct order to build the winning goal:
Add a Sprite2D and CollisionShape2D to the Goal
Place goal.tscn at the very top, near the boss
Make a New Scene with an Area2D root called Goal
Attach the script and connect body_entered
🧠
Knowledge Check
+15 XP
Why does the Goal check body.is_in_group("player") before showing "You Win"?
ASo a rolling barrel touching the goal doesn't win the game
BBecause it draws the sprite faster
CIt isn't needed, any object should win
10
🔢
🔒 Locked
Add a Score!
Count how long you survive and earn points!
🔒 Locked
🎯
Goal for this step

Show a score on screen that counts up every second the hero is alive.

🧒 For the child

Real arcade games always have a score! Ours is going to count UP every second you're alive and dodging barrels. The longer you survive, the higher your score can you beat your own record? 🏅

👨‍👩‍👧 For the grown-up

Add a CanvasLayer → Label to main.tscn for the HUD. In the main script, accumulate delta in _process and increment score each second, updating the label text. A simple int score variable in main.gd keeps things clean.

What to do:

  1. 1In main.tscn, add a CanvasLayer child. Inside it, add a Label name it ScoreLabel.
  2. 2Position the label at the top of the screen. Set its text to "Score: 0".
  3. 3Attach a script to the Main (Node2D root) and type the code below.
extends Node2D

var score = 0
var time_passed = 0.0

@onready var score_label = $CanvasLayer/ScoreLabel

func _process(delta):
    time_passed += delta
    if time_passed >= 1.0:
        time_passed = 0.0
        score += 10
        score_label.text = "Score: " + str(score)
🕹️
Try it! Run the game and watch the score climb. How high can you get before a barrel gets you?
💻
Code Challenge
+20 XP
Fill in the blanks to add points and update the label text:
if time_passed >= 1.0: time_passed = 0.0 score += score_label.text = "Score: " +
💡 Hint: We add 10 each second, and use str(score) to turn the number into text.
True or False?
+15 XP
delta is the time since the last frame, so adding it up measures real seconds.
A CanvasLayer keeps the score label fixed on screen even when the camera moves.
We must reset time_passed to 100 after each point is added.
🧠
Knowledge Check
+15 XP
Why do we reset time_passed = 0.0 after adding a point?
ATo delete the score
BTo stop the game
CSo it starts counting toward the next full second again
11
🔒 Locked
Make It Get Harder!
The longer you survive, the faster the barrels!
🔒 Locked
🎯
Goal for this step

Make barrels roll faster and spawn more often as the score goes up.

🧒 For the child

Right now the barrels always go the same speed. But in real arcade games they get FASTER! We're going to make it so the longer you play, the more barrels there are and the quicker they go. Uh oh! 😬

👨‍👩‍👧 For the grown-up

Two changes: (1) In main.gd, as score increases, shorten the Boss's Timer wait_time. (2) Pass a speed multiplier to each barrel on instantiation. Every 50 points, reduce wait_time by 0.2s (min 0.8s) and increase ROLL_SPEED. Cap it so it stays playable!

👨‍👩‍👧
Grown-up note: Difficulty scaling is one of the most satisfying game-feel moments for kids to implement they immediately want to test it. Cap the speed increase so it stays possible!

What to do:

  1. 1Open your boss.tscn script.
  2. 2Give the barrel a speed boost when spawning it add the extra line shown below.
  3. 3In main.gd, add the difficulty update code that fires every 50 points.
# In boss.tscn script modify _on_timer_timeout:
var speed_boost = 1.0  # We'll increase this over time

func _on_timer_timeout():
    if barrel_scene:
        var barrel = barrel_scene.instantiate()
        barrel.global_position = global_position + Vector2(0, 40)
        barrel.speed_boost = speed_boost  # Pass boost to barrel!
        get_parent().add_child(barrel)

# In barrel.tscn script — add this variable and use it:
var speed_boost = 1.0
# Change the roll line to:
#   velocity.x = direction * ROLL_SPEED * speed_boost

# In main.gd — call this when score goes up:
func update_difficulty():
    var boss = $Boss
    boss.speed_boost = 1.0 + (score / 100.0)
    boss.$Timer.wait_time = max(0.8, 2.5 - (score / 200.0))
🕹️
Try it! Play for 30 seconds. Do the barrels come faster? Is it getting tricky? That's game design in action! 🎮
🔮
Predict What Happens
+15 XP
Your difficulty code sets the boss Timer's wait_time using max(0.8, 2.5 - (score / 200.0)).

The player reaches a HUGE score, so 2.5 - (score / 200.0) would become a negative number. What wait_time does the Timer actually use?
AA negative number, so the game breaks
B0.8 — because max() never lets it go below 0.8
C2.5 — it ignores the score
✏️
Fill in the Blanks
+15 XP
To stop the barrels becoming impossibly fast, we use the function to keep the wait time from dropping below a safe value. Making a game get harder over time is called difficulty .
🧠
Knowledge Check
+15 XP
How do we make the barrels spawn more often as the score rises?
AMake the boss Timer's wait_time smaller
BMake the wait_time bigger
CDelete the boss
12
🎨
🔒 Locked
Make It Your Own!
This is YOUR arcade game go wild!
🔒 Locked
🎯
Goal for this step

Customise everything characters, colours, level layout, and your own creative twist!

🧒 For the child

THIS IS THE BEST STEP! 🎉 Your game already works. It's a REAL arcade game! Now make it completely YOURS. Give the hero a name. Make the gorilla purple. Design a wild level with tons of ladders. Add more floors! You made this you're an arcade game developer! 🕹️

👨‍👩‍👧 For the grown-up

Great stretch goals: animate the hero flipping with scale.x; add a high score saved with FileAccess; add sound effects with AudioStreamPlayer; add a faster second barrel type; add a lives system (3 hearts in a CanvasLayer); or add a second level using change_scene_to_file().

What to do:

  1. 1Redesign the level layout add more girders, more ladders, new gaps!
  2. 2Change all the colours and sizes make it feel like YOUR game.
  3. 3Give your hero and boss fun names in the scene.
  4. 4Add a Lives system start with 3 lives instead of instant game over.
  5. 5Add a jump sound using an AudioStreamPlayer node. 🔊
  6. 6Give your game a name in Project → Project Settings → Application → Name.
🕹️
Try it! Show your finished game to someone and challenge them to beat your high score! 🏆
Final True or False!
+15 XP
An AudioStreamPlayer node is used to play sounds like a jump effect.
A lives system can make the game friendlier than instant game over.
Our game uses a hero, girders, ladders, a barrel-throwing boss, a goal and a score.
🔢
Recap: Order the Build
+15 XP
Put the whole build in the order we made it:
Build the Hero who runs and jumps
Add the boss that throws rolling barrels
Build girders and ladders to climb
Add the win goal and a score
🧠
Final Knowledge Check
+15 XP
Which of these is the best reason this game counts as "yours"?
ABecause you downloaded Godot
BBecause you built every part and customised the characters, level and rules
CBecause Donkey Kong made it first
🎉🦍🛢️🎊🏆
You Built an Arcade Game!

Amazing — you made a real Donkey Kong-style game with a climbing hero, ladders, rolling barrels, a boss, a win goal and a score that scales. You're an arcade game developer!

0
Total XP
1
Level
0
Best Streak
0%
Accuracy
🗡️ Episode 6: Pixel Quest → ⭐ View My Progress & Certificates

This workshop was free and took many hours to build. If it helped you learn something new, consider supporting the project.

☕ Support on Ko-fi

🎮 What We're Building

A climbing arcade game inspired by the original Donkey Kong! Your hero climbs girder platforms and ladders, dodges barrels rolling down from the top, and reaches the goal to win.

🧒 For the Child

Have you ever seen old arcade games? Donkey Kong was one of the very FIRST! A big gorilla at the top throws barrels and your little hero has to dodge them and climb up. We're going to make our own version with our own characters!

👨‍👩‍👧 For the Grown-Up

This is Episode 3 of My First Video Game. It builds on Jump Jump's gravity and CharacterBody2D patterns, adding new concepts: ladder climbing (disabling gravity on overlap), AnimatableBody2D for rolling barrels, a Timer node for barrel spawning, and a simple thrower AI. No prior episodes required.

✨ What You'll Make

  • A hero who runs and jumps
  • Girder platforms to stand on
  • Ladders to climb up and down
  • A big boss at the top who throws barrels
  • Barrels that roll and fall down
  • A win condition when you reach the top
  • A score that counts how long you survive
  • Your very own arcade level!
⭐ My First Video Game · Series 1
You finished Episode 5! 🎉
One more! Build a Zelda-style adventure with a sword and dungeons.
← Ep 4 · Fairy Survivors 🗡️ Next: Ep 6 · Pixel Quest! →

🛠️ Free In-House Dev Tools

Make It Yours

Use these free browser tools alongside this workshop to create custom sprites, sounds, levels and colour schemes for your game. No installs. Free forever.

🎨
Pixel Studio
Draw sprites & animations
🗺️
Level Designer
Build 2D tile maps
🎵
SFX Studio
Create custom sound effects
🎨
Colour Palette
Build a game-ready colour scheme
🎲
Game Idea Gen
Random game concepts & prompts
🛠️ See All 20 Free Tools →