diff --git a/src/data/levels/level01.js b/src/data/levels/level01.js index 16f36e9..de946bf 100644 --- a/src/data/levels/level01.js +++ b/src/data/levels/level01.js @@ -383,6 +383,12 @@ export default { ] }, ], obstacles: [], + items: [ + { type: "tv", mode: "gravity", x: 5754, y: 444 }, + { type: "cone", mode: "gravity", x: 2479, y: 369 }, + { type: "cone", mode: "gravity", x: 2721, y: 219 }, + { type: "cone", mode: "gravity", x: 2521, y: 136 }, + ], goal: { x: 25420, y: 406, width: 280, height: 640 }, cameraBounds: { x: -600, y: -522, width: 27060, height: 2414 }, }; diff --git a/src/entities/SmashItemManager.js b/src/entities/SmashItemManager.js index 44c7ce6..f855fc4 100644 --- a/src/entities/SmashItemManager.js +++ b/src/entities/SmashItemManager.js @@ -112,11 +112,24 @@ export default class SmashItemManager { } // The smash: swap to the smashed frame, make the body dynamic (so the - // launch actually moves it), and give it the up-and-forward impulse. + // launch actually moves it), give it the up-and-forward impulse, and clear + // the bus out of its collision mask so the bus drives straight through it. _smash(item) { const image = item.image; const dirX = Math.sign(this.bus.chassis.body.velocity.x) >= 0 ? 1 : -1; + // From this moment on the smashed item is no longer solid to the bus. + // Clear the bus's category bit out of the item's collision mask so the + // broadphase skips every item<->bus pair (Detector.canCollide only + // considers a pair when each side's mask includes the other's category - + // see the vendored build). Set on the raw matter body directly: that's the + // exact field canCollide reads, and matter-js recomputes pairs every step, + // so this takes effect on the very next physics step. The item keeps its + // mask against everything ELSE (terrain, other items, kids), so it still + // lands and rests where it flies - only the bus is exempted. This is what + // makes the bus "drive through" a smashed prop instead of bumping it. + image.body.collisionFilter.mask = 0xffffffff & ~this.bus.busCategory; + // setStatic(false) (Phaser component, same as in _buildItem) restores // the body's saved real mass/inertia - matter-js stashed them when the // body was made static - so the velocity math below is meaningful. For