跳转到内容

How to create perfect collision detection in Scratch

此内容尚不支持你的语言。

💡 Struggling with collision detection? Want smooth character movement in your games? 🚀 Get Help Now

GJ

GameDev_Jordan

Posted on July 13, 2025 • Beginner

🎮 Need perfect collision detection!

Hey everyone! I’m working on a platformer game and I’m struggling with collision detection. I want my character to move smoothly but stop perfectly when hitting walls.

Right now I have this basic setup:

    when flag clicked
forever
// Movement code here
end
  

But I don’t know what to put inside to make the collision work perfectly. I want:

  • Smooth character movement with arrow keys
  • Perfect wall collision (no getting stuck in walls)
  • Character stops right at the wall edge

Can someone help me figure this out? I want it to be perfect! 😊

CM

CollisionMaster_Nina

Replied 30 minutes later • ⭐ Best Answer

Perfect question @GameDev_Jordan! Collision detection is crucial for good games. Let me show you several methods from basic to advanced! 🎯

🔄 Collision Detection Flow

Here’s how proper collision detection works:

flowchart TD A[🎮 Player Input] --> B[Move Character] B --> C{Touching Wall?} C -->|No| D[✅ Continue Movement] C -->|Yes| E[🔄 Undo Movement] E --> F[📍 Position at Wall Edge] F --> G[🛑 Stop Movement] D --> H[🔄 Check Next Frame] G --> H H --> A style A fill:#e1f5fe style B fill:#f3e5f5 style C fill:#fff3e0 style E fill:#ffebee style F fill:#e8f5e8

🎯 Method 1: Basic Wall Collision

This is the most reliable method for wall collision:

    when flag clicked
go to x: (0) y: (0)
forever
if <key [right arrow v] pressed?> then
change x by (5)
check walls
end
if <key [left arrow v] pressed?> then
change x by (-5)
check walls
end
if <key [up arrow v] pressed?> then
change y by (5)
check walls
end
if <key [down arrow v] pressed?> then
change y by (-5)
check walls
end
end

define check walls
repeat until <not <touching [Wall v]?>>
if <(x position) > [0]> then
change x by (-1)
else
change x by (1)
end
if <(y position) > [0]> then
change y by (-1)
else
change y by (1)
end
end
  

🎨 Method 2: Color-Based Collision

Great for complex wall shapes:

    when flag clicked
forever
if <key [right arrow v] pressed?> then
change x by (3)
if <touching color [#000000]?> then
change x by (-3)
end
end
if <key [left arrow v] pressed?> then
change x by (-3)
if <touching color [#000000]?> then
change x by (3)
end
end
if <key [up arrow v] pressed?> then
change y by (3)
if <touching color [#000000]?> then
change y by (-3)
end
end
if <key [down arrow v] pressed?> then
change y by (-3)
if <touching color [#000000]?> then
change y by (3)
end
end
end
  

⚡ Method 3: Smooth Pixel-Perfect Collision

For the smoothest movement possible:

    when flag clicked
forever
set [x velocity v] to (0)
set [y velocity v] to (0)

// Get input
if <key [right arrow v] pressed?> then
change [x velocity v] by (3)
end
if <key [left arrow v] pressed?> then
change [x velocity v] by (-3)
end
if <key [up arrow v] pressed?> then
change [y velocity v] by (3)
end
if <key [down arrow v] pressed?> then
change [y velocity v] by (-3)
end

// Move horizontally
change x by (x velocity)
if <touching [Wall v]?> then
repeat until <not <touching [Wall v]?>>
if <(x velocity) > [0]> then
change x by (-1)
else
change x by (1)
end
end
end

// Move vertically
change y by (y velocity)
if <touching [Wall v]?> then
repeat until <not <touching [Wall v]?>>
if <(y velocity) > [0]> then
change y by (-1)
else
change y by (1)
end
end
end
end
  

🎮 Advanced Features

Diagonal Movement Fix:

    // Normalize diagonal movement
if <<key [right arrow v] pressed?> and <key [up arrow v] pressed?>> then
set [x velocity v] to (2.1)
set [y velocity v] to (2.1)
end
  

Variable Speed Movement:

    // Adjustable movement speed
set [movement speed v] to (4)
if <key [right arrow v] pressed?> then
change x by (movement speed)
end
  

💡 Pro Tips

  • Use custom blocks: Create a “check walls” block for cleaner code
  • Test different speeds: Find the right balance between smooth and responsive
  • Consider sprite size: Larger sprites need more careful collision detection
  • Use “run without screen refresh”: Makes collision checking faster

🐛 Common Issues & Solutions

  • Getting stuck in walls: Use the repeat until loop to push out
  • Jittery movement: Check collision after each axis separately
  • Slow performance: Use “run without screen refresh” on custom blocks

Try these methods and see which works best for your game! The pixel-perfect method gives the smoothest results! 🚀

GJ

GameDev_Jordan

Replied 1 hour later

@CollisionMaster_Nina This is incredible! 🤩 I tried the pixel-perfect method and it works amazingly!

My character now moves so smoothly and stops perfectly at walls. The diagonal movement fix was exactly what I needed too!

One question - how do I make the character jump and still have good collision detection?

PG

PlatformerGuru_Sam

Replied 2 hours later

@GameDev_Jordan Great question about jumping! Here’s how to add gravity and jumping to your collision system:

    // Add these variables: gravity, jump power, on ground
when flag clicked
set [gravity v] to (-0.5)
set [jump power v] to (0)
forever
// Jumping
if <<key [space v] pressed?> and <(on ground) = [1]>> then
set [jump power v] to (12)
set [on ground v] to (0)
end

// Apply gravity
change [jump power v] by (gravity)
change y by (jump power)

// Check ground collision
if <touching [Ground v]?> then
repeat until <not <touching [Ground v]?>>
change y by (1)
end
set [jump power v] to (0)
set [on ground v] to (1)
end
end
  

This gives you smooth jumping with perfect ground collision! 🦘

VB

Vibelf_Community

Pinned Message • Moderator

🎮 Master Game Development Fundamentals!

Excellent collision detection discussion! For those ready to create professional-quality games, our community can help you master:

  • 🏃 Advanced movement systems
  • 🎯 Precise collision algorithms
  • 🦘 Physics and gravity systems
  • 🎨 Smooth animation techniques

📚 Related Game Development Topics

Ready to build amazing games? Get expert guidance from our game development tutors in the Vibelf app!