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