Quick answer: Construct 3 uses collision polygons, not the visible sprite image, for collision detection. The most common cause of missed collisions is a collision polygon that does not match the sprite’s visual area. Other causes include objects on layers with different parallax rates, the Solid behavior preventing overlaps, disabled collisions, and instance picking issues that filter out the objects you expect to collide.
Here is how to fix Construct 3 collision detection that is not working. You have two objects that visually overlap on screen, but “On collision” never fires and “Is overlapping” always returns false. The objects pass right through each other as if the collision system does not exist. This is one of the most common Construct 3 problems, and it has several distinct causes that require different fixes.
The Symptom
You set up an event like “Bullet: On collision with Enemy” or “Player: Is overlapping Coin”. At runtime, the objects clearly overlap on screen but the event never triggers. No actions in the event block execute, and adding a debug text display confirms the condition is never true.
In some cases, collisions work for some instances but not others. For example, the first enemy detects collisions fine, but enemies spawned later do not. Or collisions work at certain positions on the layout but fail at others.
You might also see a related variant: collisions trigger too late, registering only after objects have significantly overlapped rather than at first contact. Or collisions trigger on empty space near the object rather than on the visible pixels.
What Causes This
There are five common causes:
1. Collision polygon does not match the sprite. Every sprite in Construct 3 has a collision polygon that defines its physical shape for collision detection. By default, Construct generates a bounding box polygon, but this may not match the actual visible area of the sprite. If the sprite has transparent regions, the collision polygon might extend beyond or not reach the visible pixels. Or if you resized the sprite without updating the polygon, the polygon is at the old size.
2. Objects on layers with different parallax. Construct 3 layers can have independent parallax (scroll rate) settings. If your player is on a layer with 100% parallax and the coins are on a layer with 50% parallax (a background layer), they appear to overlap visually but are at completely different world-space positions. Collision detection uses world coordinates, not screen coordinates.
3. Solid behavior preventing overlaps. If an object has the Solid behavior, the physics engine actively prevents other objects from overlapping it. This means “Is overlapping Solid” conditions can be unreliable because the engine pushes objects apart before the overlap check runs. “On collision” works with Solid objects, but “Is overlapping” often does not.
4. Collisions disabled via events. The “Set collisions enabled” action can disable collision detection for specific instances. If a previous event disabled collisions on an object (perhaps during a spawn animation or invincibility period) and never re-enabled them, all collision checks will fail for that instance.
5. Instance picking filters out the collision. If you have conditions before the collision check that pick a specific subset of instances, the collision check only runs against that subset. For example, if you first pick enemies with health > 0, and then check collision, enemies with health = 0 will not be detected even if they physically overlap.
The Fix
Step 1: Check and fix collision polygons. Open the sprite in the Animations editor, select a frame, and click “Set collision polygon” in the toolbar. Ensure the polygon covers the area you expect collisions to occur. Use “Set to bounding box” for rectangular shapes or manually adjust the polygon points.
// In the Animations editor:
// 1. Select the Sprite object
// 2. Open the Animations editor
// 3. Click on a frame
// 4. Click "Set collision polygon" in the top toolbar
// 5. Adjust the polygon to match the visible sprite
// Apply to all frames if they share the same shape:
// Right-click the polygon > "Apply to all animations"
// For debugging, you can visualize collision polygons at runtime:
// Enable "Show collision polygons" in the Debug panel (F6)
Step 2: Verify layer parallax settings. Both colliding objects should be on layers with the same parallax rate unless you specifically intend otherwise.
// Check layer parallax in Layout Properties:
// Select the layer in the Layers panel
// Check "Parallax X" and "Parallax Y" in Properties
// Default is 100, 100 (scrolls with camera normally)
// If objects must be on different parallax layers,
// use custom distance checking instead of collision:
+ System: Every tick
+ System: distance(Player.X, Player.Y, Coin.X, Coin.Y) < 50
-> Coin: Destroy
-> System: Add 1 to Score
Step 3: Handle Solid behavior correctly. Use “On collision” (a trigger) for Solid objects, not “Is overlapping” (a condition). If you need overlap detection with a Solid object, temporarily disable Solid, check the overlap, then re-enable it.
// Use "On collision" for Solid objects (works correctly)
+ Player: On collision with Wall
-> Player: Set velocity to 0
// If you must use "Is overlapping" with Solid:
+ System: Every tick
-> Wall: Set Solid disabled
+ Player: Is overlapping Wall
-> System: Set HitDetected to 1
-> Wall: Set Solid enabled
// Better approach: Use a separate invisible detector object
// without Solid, pinned to the same position as the wall
Step 4: Ensure collisions are enabled. Check that no event has disabled collisions on the objects in question.
// Re-enable collisions if they may have been disabled
+ System: On start of layout
-> Player: Set collisions enabled
-> Enemy: Set collisions enabled
// Common pattern: Disable collisions during spawn animation
+ Enemy: On created
-> Enemy: Set collisions disabled
-> Enemy: Set animation to "Spawn" (from beginning)
+ Enemy: On animation "Spawn" finished
-> Enemy: Set collisions enabled // Don't forget this!
Step 5: Check instance picking order. Make sure conditions before your collision check do not inadvertently filter out the instances you expect.
// BAD: Picking may filter out the colliding instance
+ Enemy: health > 0
+ Bullet: On collision with Enemy
-> Enemy: Subtract 1 from health
// GOOD: Let the collision pick first, then filter
+ Bullet: On collision with Enemy
+ Enemy: health > 0
-> Enemy: Subtract 1 from health
You can also debug picking with the scripting API:
// JavaScript: Debug collision state
const enemies = runtime.objects.Enemy.getAllInstances();
for (const enemy of enemies) {
console.log(`Enemy UID ${enemy.uid}: ` +
`x=${enemy.x.toFixed(1)}, y=${enemy.y.toFixed(1)}, ` +
`collisions=${enemy.behaviors.Solid ? 'has Solid' : 'no Solid'}`);
}
Why This Works
Each fix targets a different failure point in the collision detection pipeline:
Correct collision polygons ensure the engine tests the right physical area. Construct 3 does not use pixel-perfect collision by default — it uses polygon intersection tests. If the polygon does not match the visual sprite, the test result does not match what you see on screen.
Matching parallax ensures objects that appear to overlap actually do overlap in world coordinates. The renderer applies parallax as a visual offset, but the collision system uses unmodified world positions. Two objects at the same screen position can be far apart in world space if their layers have different parallax rates.
Correct Solid handling avoids the push-out problem. The Solid behavior’s purpose is to prevent overlaps, so it actively fights against any overlap condition you try to check. Using “On collision” (which fires at the moment of contact, before push-out) or removing Solid from overlap-detection objects solves this conflict.
Enabled collisions allow the engine to include the object in its spatial queries. Disabling collisions removes the object from the collision acceleration structure entirely — it becomes a ghost that no other object can detect.
Correct picking order ensures the right instances are in the Selected Object List when the collision check runs. Construct 3 evaluates conditions top-to-bottom, and each condition narrows the SOL. If a condition before the collision check filters out an instance, the collision test never considers it.
"Enable the debug collision polygon overlay (F6 in preview). If you can see the polygons, you can see the problem. It saves more time than any other Construct 3 debugging technique."
Related Issues
If your objects are being destroyed unexpectedly and collision events reference stale instances, see Construct 3 ‘Object Not Found’ error after destroying instances. For animation-related collision issues where the collision polygon changes between frames, check Construct 3 animation not playing or stuck on first frame. And if collision-triggered audio is not working, Construct 3 audio not playing in browser covers the browser restrictions that can silence collision sound effects.
Visualize the polygons. If you cannot see them, you cannot debug them.