box2d 粗略的模擬水浮力

2021-08-26 19:52:27 字數 951 閱讀 3815

準備工作,首先修改 box2d 的 b2body 類,

增加乙個public 修飾的 bool 型別標識變數 m_isinwater,用於標識物體當前是否在水中。

然後,切到 box2d 的 b2world 類,在 createbody 方法的尾部新增一行初始化標識變數的**:

b2body* b2world::createbody(const b2bodydef* def) void* mem = m_blockallocator.allocate(sizeof(b2body)); b2body* b = new (mem) b2body(def, this); // add to world doubly linked list. b->m_prev = null; b->m_next = m_bodylist; if (m_bodylist) m_bodylist = b; ++m_bodycount; /** added by bruce yang on 2011.11.25.12.49~ */ b->m_iscuttable = true; // body 預設設定為可被切割的~ b->m_isballoon = false; // body 預設設定為非氣球~ b->m_isinwater = false; // body 預設設定不在水中(即使出生就在水中也不要緊,contactlistener會立即做相應設定)~ return b; }contactlistener 的相關**:

我開始是將表示變數放在 ccsprite 類裡面的,這樣會出現乙個問題:

contactlistener 當物體脫離水區域呼叫 removebuoyancytag() 方法的時候

如果在水中將該 body 切割的話(切割會將舊 body 銷毀,並生成兩份新的 body),從 body 裡面取出 ccsprite 物件會報出錯誤,

後來在我將 isinwater 這個標識放到 b2body 裡面後,乾掉了這個bug(沒做細緻的測試,不過試了蠻多次,沒發現出問題)~

box2d 碰撞過濾

原帖 碰撞篩選就是乙個防止某些形狀發生碰撞的系統。按照具體需求設定哪些物體跟那些物體發生碰撞,跟哪些物體不發生碰撞。box2d通過種群跟組索引支援碰撞篩選。組索引比較簡單,設定其shapedef的groupindex值即可,例如boxdef.filter.groupindex 1。通過groupin...

Box2D學習筆記

box2d是乙個用於遊戲的2d剛體 庫,程式設計師可以在他們的遊戲裡使用他們,也可以是的自己的物體運動的更可信。讓他看起來更加接近現實。物理引擎是乙個程式性的動畫系統。而不是由動畫師去移動物體。這一切都是建立在牛頓力學的基礎之上。box2d最初是用c 來寫的,之後有被多種語言所實現。box2d中的核...

BOX2d繪製曲線

來自天地會的 wkyjoey同學 問道如何做乙個重力大師遊戲 如下圖 這裡要特意表示一下歉意,最近一直忙於工作,沒有及時更新教程。對於重力大師遊戲 試玩之後,不難發現,我們在執行時可以建立的剛體有兩種,線條剛體和多邊形剛體。今天我們來一起研究一下線條剛體的建立。多邊形剛體會在下次教程中討論。這裡我們...