Aller au contenu

Collision Detection in Scratch Platformer Games

Ce contenu n’est pas encore disponible dans votre langue.

💡 Having trouble with Scratch block assembly? Don’t know how to implement code logic? 🚀 Get Help Now

PD

PlatformDev92

Posted on July 28, 2025 • Intermediate

🎮 Need help with platformer collision detection

Hey everyone! I’m working on a platformer game in Scratch and I’m struggling with collision detection. My character keeps getting stuck in walls or falls through platforms sometimes.

What’s the best code approach for reliable collision detection in a platformer? I want my character to:

  • Land properly on platforms without falling through
  • Not get stuck when hitting walls from the side
  • Handle slopes and different platform shapes

Any help with the collision detection logic would be amazing! 🙏

GM

GameMaster_Alex

Replied 4 minutes later • ⭐ Best Answer

Great question @PlatformDev92! Collision detection is crucial for smooth platformer gameplay. Here’s a comprehensive approach that works really well:

🔧 Collision Detection Flow

Here’s how proper collision detection should work:

flowchart TD A[🚀 Player Movement Input] --> B[Calculate New Position] B --> C[Check X-axis Collision] C --> D{Touching Wall?} D -->|Yes| E[Stop X Movement] D -->|No| F[Apply X Movement] E --> G[Check Y-axis Collision] F --> G G --> H{Touching Platform?} H -->|From Above| I[Land on Platform] H -->|From Below| J[Stop Upward Movement] H -->|No Collision| K[Apply Gravity] I --> L[Set on_ground = true] J --> M[Set y_velocity = 0] K --> N[Set on_ground = false] L --> O[🎮 Update Player Position] M --> O N --> O style A fill:#e1f5fe style E fill:#ffebee style I fill:#e8f5e8 style O fill:#f3e5f5

🎯 Step 1: Separate X and Y Collision Detection

The key is to handle horizontal and vertical movement separately:

    when flag clicked
forever
// Handle X movement first
change x by (x_velocity)
if <touching [Platforms v]?> then
if <(x_velocity) > [0]> then
repeat until <not <touching [Platforms v]?>>
change x by [-1]
end
else
repeat until <not <touching [Platforms v]?>>
change x by [1]
end
end
set [x_velocity v] to [0]
end

// Handle Y movement second
change y by (y_velocity)
if <touching [Platforms v]?> then
if <(y_velocity) < [0]> then
// Landing on platform
repeat until <not <touching [Platforms v]?>>
change y by [1]
end
set [y_velocity v] to [0]
set [on_ground v] to [1]
else
// Hitting ceiling
repeat until <not <touching [Platforms v]?>>
change y by [-1]
end
set [y_velocity v] to [0]
end
else
set [on_ground v] to [0]
end
end
  

🏃 Step 2: Player Movement Controls

Handle input and apply physics:

    when flag clicked
forever
// Horizontal movement
if <key [right arrow v] pressed?> then
set [x_velocity v] to [5]
else
if <key [left arrow v] pressed?> then
set [x_velocity v] to [-5]
else
set [x_velocity v] to [0]
end
end

// Jumping
if <<key [space v] pressed?> and <(on_ground) = [1]>> then
set [y_velocity v] to [12]
end

// Apply gravity
if <(on_ground) = [0]> then
change [y_velocity v] by [-0.8]
end

// Limit falling speed
if <(y_velocity) < [-15]> then
set [y_velocity v] to [-15]
end
end
  

🎨 Step 3: Platform Setup

Make sure your platforms are set up correctly:

    // For each platform sprite
when flag clicked
go to x: [0] y: [-100]  // Position your platform
show

// Make sure platforms have solid colors
// Avoid gradients or complex costumes for collision detection
  

🚀 Step 4: Advanced Collision Techniques

For even better collision detection:

Pixel-Perfect Detection:

    // Custom collision detection using color
define check collision at x: (x_offset) y: (y_offset)
change x by (x_offset)
change y by (y_offset)
if <touching color [#000000]?> then  // Black = solid
set [collision_detected v] to [1]
else
set [collision_detected v] to [0]
end
change x by ((x_offset) * [-1])
change y by ((y_offset) * [-1])
  

Slope Handling:

    // For slopes, check multiple points
define check slope collision
set [slope_height v] to [0]
repeat [5]
change y by [1]
if <not <touching [Platforms v]?>> then
change [slope_height v] by [1]
else
stop [this script v]
end
end
// Adjust player position based on slope_height
  

This approach gives you smooth, reliable collision detection that prevents getting stuck in walls or falling through platforms! 🎮

PD

PlatformDev92

Replied 15 minutes later

@GameMaster_Alex This is exactly what I needed! 🎉 The separate X and Y collision detection makes so much sense now.

I implemented your code and my character no longer gets stuck in walls. The movement feels much smoother now. Thank you!

PT

PlatformerTutor

Replied 1 hour later

Great solution @GameMaster_Alex! 👏 I’d also recommend checking out this comprehensive platformer tutorial that covers collision detection in detail:

Advanced Platformer Physics Tutorial

It includes examples for:

  • 🎯 One-way platforms
  • 🔄 Moving platforms
  • ⚡ Wall jumping mechanics
  • 🌊 Water/liquid collision
VB

Vibelf_Community

Pinned Message • Moderator

🚀 Master Advanced Platformer Development

Excellent discussion on collision detection! For those ready to take their platformer games to the next level, our expert tutors can help you implement:

  • 🎯 Advanced physics systems
  • 🔄 Complex platform mechanics
  • ⚡ Optimized collision algorithms
  • 🎮 Professional game feel

📚 Related Topics

Ready to create professional-quality platformer games? Get personalized guidance from our expert tutors!