首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Box2D 與 Cocos2D:關閉特定剛體的碰撞偵測

     編輯:程式設計綜合問答

問題場景

在使用 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 的位元運算,可實現複雜的碰撞規則(如:玩家子彈不打中玩家、敵人之間不碰撞等)。

注意事項

  • Sensor 仍需呼叫 CreateFixture,否則不會加入物理世界。
  • 若在運行時動態切換碰撞狀態,需先 DestroyFixture 再重建,或使用 SetSensor(bool)(Box2D v2.3+ 支援)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved