Quick answer: Physics behavior objects have their own Box2D collision system that does not integrate with Construct 3’s native On Collision trigger. For mixed Physics/non-Physics detection, use Is Overlapping With conditions or bridge with invisible helper objects that have matching behaviors.

Here is how to fix Construct 3 collision not detecting with mixed behaviors. You have a player with 8Direction behavior and enemies with Physics behavior. Your On Collision event between Player and Enemy never triggers. You confirm collision polygons are set. Sprites clearly overlap. Construct 3’s collision system has two parallel worlds — native and Physics — and they do not always speak to each other.

The Symptom

An On Collision event between two objects does not fire even when they visibly overlap. Common when one object uses Physics behavior and the other does not. Or when both objects are in different families with overlapping members. Event preview shows the event exists and is enabled; at runtime nothing triggers.

Variant: collision works initially but stops after some condition (pinned, awake/asleep, resize). Or fires too often because the objects overlap for multiple frames.

What Causes This

Physics uses Box2D separately. Physics behavior objects interact via Box2D’s own collision system. When a Physics object collides with a non-Physics object, Construct 3’s native On Collision may not see it unless the non-Physics object also has Solid behavior. The integration is incomplete.

Missing collision polygon. Every sprite has a collision polygon set in the image editor. If you imported a sprite and forgot to set the polygon (or cleared it), the object has no collision shape and nothing can hit it. Default is a bounding box, but custom sprites sometimes end up with empty polygons.

Tunneling at high speed. Construct runs events at 60 Hz by default. An object moving 900 px/frame passes through anything less than 900 px thick between frames. On Collision fires on overlap detection, and there was no overlap — the object skipped over.

Events in wrong order. On Collision is a trigger — it fires once per collision event, at the moment of overlap. If your code destroys one object before the event can fire, the collision is missed. Event order within a tick matters.

Family-vs-instance mismatch. If you have On Collision between Family A and Family B, and the actual objects are in different families with overlapping membership, the trigger may fire multiple times or not at all depending on how Construct resolves the family lookup.

The Fix

Step 1: For Physics + non-Physics, use Is Overlapping With. Instead of On Collision, add an event with condition “Is overlapping with <Object>.” This runs every tick and checks any overlap between the two objects, regardless of behavior:

// Event sheet
Every tick
  Player Is overlapping Enemy
    -> Subtract 1 from Player.health
    -> Destroy Enemy

Is Overlapping With uses Construct’s collision polygon check, which works across behavior types. Slightly more expensive than On Collision (runs every tick) but always reliable.

Step 2: Verify collision polygons. Open each sprite in the image editor. Click the “Set Collision Polygon” button (checkered shape icon). Verify the polygon covers the visible area. For complex shapes, use “Trace outline” to auto-generate or adjust manually. An empty polygon produces no collisions.

Step 3: Prevent tunneling for fast objects. Construct 3 provides several options:

Pixel-by-pixel stepping is slower (CPU-wise) but checks every pixel of movement for collisions. Eliminates tunneling at the cost of frame time.

Step 4: Use intermediary objects for hybrid detection. Sometimes the cleanest solution is a helper. A player with 8Direction can spawn an invisible “hit sensor” sprite with Physics behavior attached. The hit sensor collides with Physics enemies in Box2D-land and reports back to the player via event logic.

Physics + Physics Collisions

For two Physics objects, use the Physics behavior’s “On collision with <Object>” trigger (different from native On Collision). This is Box2D’s collision event and works correctly between physics objects.

Mixing “On Collision” (native) and “On Physics collision” (Box2D) in the same event sheet is confusing but legal — make sure you pick the right one for each object pair.

Family Considerations

If you use families for polymorphic collision (Player On Collision with Enemy Family), ensure the family contains all intended enemy types and no unintended ones. A family member added as a behavior-only stub without a sprite participates weirdly in collision events.

When picking objects in an event, Construct applies SOL (System of List) filtering. If your On Collision filters to a specific instance via a prior condition, only that instance’s collisions fire. Events with no prior filtering consider all instances.

Debug Technique

Add a Text object that displays collision counts during play:

On Player collision with Enemy:
  Add 1 to global variable collisions_detected
  Text: Set text to "Hits: " & collisions_detected

If the counter stays at 0 while you visibly crash into enemies, the collision trigger is not firing — use Is Overlapping instead. If it increments but your game does not react, the collision is firing but the effect logic has a bug.

“Construct 3’s collision system is two systems stitched together. Know which one each of your objects lives in, and bridge with Is Overlapping when they must talk.”

Related Issues

For 2D game performance tips, see Construct 3 Performance Tips. For engine choice, Construct 3 vs Godot for 2D Games covers related tradeoffs.

Is Overlapping With for cross-behavior detection. On Collision only between same-behavior objects.