日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

box2d 碰撞检测_box2d 碰撞检测 - by 小Ka

發布時間:2023/12/20 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。