我正在使用box2d,並且有我正在銷燬世界時間步之外的物體(已標記它們標記它們以供刪除),但聯繫人偵聽器仍然因爲獲得引用這些機構的聯繫人。聯繫人偵聽器崩潰當Box2D主體在時間之外被摧毀步驟
這就是在presolve完成,並開始接觸聽衆的聯繫方法:
const b2Body* bodyA = contact->GetFixtureA()->GetBody();
const b2Body* bodyB = contact->GetFixtureB()->GetBody();
Object * objectA = (Object*)bodyA->GetUserData();
Object * objectB = (Object*)bodyB->GetUserData();
無論對象A或對象B,因爲該對象已被刪除,實際上會指向廢話(世界時間步長的外)。顯示正在創建糟糕的聯繫人或者應該不存在的聯繫人仍然存在。
更新
我已經改變了代碼出了世界一步,以確保和驗證正確的屍體被摧毀(以及它們的容器的身體),發現接觸聽衆仍試圖處理聯繫人這不應該存在。我碰巧在iOS/Xcode並啓用NSZombie,確實發現聯絡主體userdata是釋放對象(消息發送到釋放實例)。檢查Box2d源我發現當主體被銷燬時觸點確實被銷燬。我將不得不經歷更多的Box2D代碼,或者只是改變我的代碼,以某種方式解決聽衆收到的這些神祕聯繫。
當我測試將身體的userdata設置爲null(再次,在世界步驟之外)時,我在該身體的聯繫人偵聽器中接收的聯繫人(當我在聯繫人偵聽器中檢查它時)沒有空userdata 。
你如何摧毀屍體?請顯示代碼。 – Pavel
屍體被以正確的方式銷燬(world-> DestroyBody(body);)。我知道身體被摧毀,問題在於舊的聯繫人在摧毀身體時似乎沒有被刪除,所以這些舊聯繫人通過聯繫人聽衆進入並導致問題。 –
world-> DestroyBody破壞所有身體接觸。看看它的代碼:http://pastebin.com/cKJDfN6c(v2.2.1)。我認爲,你混在一起(例如,摧毀另一個身體) – Pavel