box2d 碰撞检测_box2d 碰撞检测 - by 小Ka
當你用到box2d后,box2d的碰撞監聽檢測 是最常用的內容之一。
在這里簡要說明一下,為后面的內容做點鋪墊。呵呵
1.通過繼承并實現b2ContactListener這個類,
class MyContactListener : publicb2ContactListener
{
……
}
2.進源代碼你可以看到這個類中有 4個回調函數,
class MyContactListener : publicb2ContactListener
{
//碰撞開始 即發現物體間重疊點時通知
virtual void BeginContact(b2Contact*contact);///碰撞結束 結束重疊后通知
virtual void EndContact(b2Contact*contact) ;//碰撞處理前 即根據物理定律處理剛體前
virtual void PreSolve(b2Contact* contact, const b2Manifold*oldManifold);//碰撞處理后
virtual void PostSolve(b2Contact* contact, const b2ContactImpulse* impulse);
}
重寫這4個函數。在相關的函數中加入你想要碰撞處理的內容。 即可
3.把你這個監聽類加入到世界中
world->SetContactListener(mContactListener);
你就可以監聽碰撞事件了。
這里有幾個注意的地方:
1。我們不能在上面這幾個回調函數中刪除摧毀剛體。因為上面調用都是在box2d的b2World::Step方法中,此時正在進行遍歷物理世界的world->GetBodyList()
對物理時間世界進行演算。
官方說明:“你可能會以碰撞來施加傷害,并試圖摧毀關聯的角色和它的剛體。然而,Box2D 并不允許你在回調中改變物理世界,因 為你可能會摧毀 Box2D 正在運算的對象,造成野指針。”
如果強在里面加摧毀物體函數,你可能會發現world是被鎖定的。如需要摧毀,只能用一個容器把需要的處理事件保存起來,帶step方法執行完畢后再處理這些容器;具體的摧毀動態剛體的方法在下下章寫。。。
2。如果你在PreSolve()里改變了物體的位置,比如使他們后退一點,他們互不碰撞,那么他們不會調用EndContact();
3。你有時候很希望他們可以選擇碰撞的方向:比如 天上一堵墻 從下面可以穿過不會碰撞,上面接觸會碰撞 不能穿過。這屬于box2d中OneSidedPlatform的內容。具體的我會在下一章寫。
但要注意 如果你想碰撞后修改成穿過的狀態 應該用?contact->SetEnabled(false); ? 而不是?myShapeDef.isSensor = true; ?你在代碼里可以嘗試下兩個的區別。還是有點小明顯。雖然isSensor 是讓
傳感器會偵測碰撞而不產生碰撞反應。
box2d單純的碰撞檢測還是比較好看明白。還是附個小例子吧~
下載例子dome :附件
總結
以上是生活随笔為你收集整理的box2d 碰撞检测_box2d 碰撞检测 - by 小Ka的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【科研技巧】PPT如何导出1000dpi
- 下一篇: Python量策风指标