DEV Community

ItsMyBot
ItsMyBot

Posted on

5 Physics Systems You Can Build in Scratch (With Working Code)

Physics transforms boring games into engaging experiences. Here are 5 systems you can build in Scratch today.

What Is Physics in Games?

Physics simulates real-world forces:

  • Gravity - Objects fall naturally
  • Momentum - Moving objects keep moving
  • Friction - Things slow down over time
  • Collision - Realistic bouncing and impact

System 1: Basic Gravity (Start Here)

The foundation of all physics games:

when green flag clicked
set [y velocity] to (0)
forever
  // Gravity pulls down
  change [y velocity] by (-1)

  // Apply movement
  change y by (y velocity)

  // Ground collision
  if <touching [ground]?> then
    repeat until <not <touching [ground]?>>
      change y by (1)
    end
    set [y velocity] to (0)
  end
end
Enter fullscreen mode Exit fullscreen mode

What you get: Sprites fall naturally and land on platforms.

Use for: Every platformer, falling object game, jumping mechanic


System 2: Platformer Physics

Add horizontal movement, friction, and jumping:

when green flag clicked
set [x velocity] to (0)
set [y velocity] to (0)
forever
  // Left/right input
  if <key [right arrow] pressed?> then
    change [x velocity] by (1)
  end
  if <key [left arrow] pressed?> then
    change [x velocity] by (-1)
  end

  // Speed limit
  if <(x velocity) > [8]> then
    set [x velocity] to (8)
  end

  // Friction
  set [x velocity] to ((x velocity) * (0.85))

  // Movement
  change x by (x velocity)

  // Gravity
  change [y velocity] by (-1)
  change y by (y velocity)

  // Jump
  if <<key [space] pressed?> and <touching [ground]?>> then
    set [y velocity] to (15)
  end
end
Enter fullscreen mode Exit fullscreen mode

Result: Professional-feeling character control


System 3: Realistic Bouncing

Make balls bounce with energy loss:

when green flag clicked
set [y velocity] to (0)
forever
  // Gravity
  change [y velocity] by (-1)
  change y by (y velocity)

  // Bounce
  if <touching [ground]?> then
    repeat until <not <touching [ground]?>>
      change y by (1)
    end

    // Reverse and lose energy
    set [y velocity] to ((y velocity) * (-0.7))

    // Stop if too weak
    if <([abs v] of (y velocity)) < [2]> then
      set [y velocity] to (0)
    end
  end
end
Enter fullscreen mode Exit fullscreen mode

Physics principle: Multiplying by -0.7 = bounce at 70% height

Use for: Bouncing balls, falling objects, pinball


System 4: Projectile Arc (Angry Birds Style)

Launch objects with realistic trajectories:

// Launch
when [space] key pressed
set [x velocity] to (15)
set [y velocity] to (10)

// Flight
when I receive [launch]
repeat until <touching [ground]?>
  // Gravity affects vertical only
  change [y velocity] by (-0.5)

  // Movement
  change x by (x velocity)
  change y by (y velocity)

  // Air resistance
  set [x velocity] to ((x velocity) * (0.98))
end
Enter fullscreen mode Exit fullscreen mode

Result: Objects fly in parabolic arcs


System 5: Slope Physics

Climb ramps realistically:

forever
  change x by (x velocity)

  // If touching ground, try climbing
  if <touching [ground]?> then
    set [climb attempt] to (0)
    repeat (8)
      change y by (1)
      change [climb attempt] by (1)

      // Successfully climbed
      if <not <touching [ground]?>> then
        stop [this script]
      end
    end

    // Too steep - push back
    change y by ((0) - (climb attempt))
    change x by ((0) - (x velocity))
    set [x velocity] to (0)
  end
end
Enter fullscreen mode Exit fullscreen mode

Smart detection: Tries to climb up to 8 pixels, fails if too steep


Common Physics Bugs

Bug 1: Falling Through Ground

Cause: Moving too fast in one frame

Fix: Pixel-perfect collision

repeat ([abs v] of (y velocity))
  change y by (sign of y velocity)
  if <touching [ground]?> then
    change y by (sign of y velocity * -1)
    set [y velocity] to (0)
    stop [this script]
  end
end
Enter fullscreen mode Exit fullscreen mode

Bug 2: Infinite Bouncing

Cause: Not losing energy

Fix: Multiply by less than 1

set [y velocity] to ((y velocity) * (-0.7))  // Loses 30%
Enter fullscreen mode Exit fullscreen mode

Bug 3: Jittery on Ground

Cause: Collision fighting movement

Fix: Only stop when moving down

if <<touching [ground]?> and <(y velocity) < [0]>> then
  set [y velocity] to (0)
end
Enter fullscreen mode Exit fullscreen mode

Quick Reference

System Difficulty Best For
Gravity ⭐ Easy All physics games
Platformer ⭐⭐ Medium Side-scrollers
Bouncing ⭐⭐ Medium Ball games
Projectiles ⭐⭐⭐ Medium Angry Birds clones
Slopes ⭐⭐⭐ Hard Advanced platformers

Complete Tutorial

For advanced techniques including:

  • Rope/pendulum physics
  • Car racing mechanics
  • Destruction physics
  • Performance optimization
  • Collision debugging

[ https://itsmybot.com/how-to-create-physics-based-games-in-scratch/
]( https://itsmybot.com/how-to-create-physics-based-games-in-scratch/

)

Your Turn

Which physics system will you build first?

Drop a comment with your project idea!

Pro tip: Start with basic gravity, then add one system at a time. Don't try to build everything at once.


About: I teach game development at ItsMyBot, where we help kids aged 5-15 learn coding through project-based courses. Physics is always a favorite breakthrough moment!

Top comments (0)