在使用 Cocos2D 搭配 Box2D 物理引擎時,有時需要讓某個 b2Body 不參與碰撞反應(例如:幽靈模式、觸發區域),但又不想移除該剛體。此時可透過將對應的 b2Fixture 設為 Sensor 來達成。
b2FixtureDef fd;
fd.isSensor = true; // 關鍵:設為感測器,不產生碰撞力
body->CreateFixture(&fd); // 將 fixture 附加到 body
設定 isSensor = true 後,該 fixture 仍會觸發 BeginContact / EndContact 回呼,但不會產生物理推擠效果。
若需更精細控制(如:只與特定層級碰撞),可結合 b2Filter 使用:
fd.filter.categoryBits = 0x0001; // 自己屬於的類別
fd.filter.maskBits = 0x0002; // 只與類別 0x0002 碰撞
fd.filter.groupIndex = 0; // 群組索引(負數表示永不碰撞)
透過 categoryBits 與 maskBits 的位元運算,可實現複雜的碰撞規則(如:玩家子彈不打中玩家、敵人之間不碰撞等)。
CreateFixture,否則不會加入物理世界。DestroyFixture 再重建,或使用 SetSensor(bool)(Box2D v2.3+ 支援)。