2013-07-30 21 views
2

我正在使用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 。

+0

你如何摧毀屍體?請顯示代碼。 – Pavel

+0

屍體被以正確的方式銷燬(world-> DestroyBody(body);)。我知道身體被摧毀,問題在於舊的聯繫人在摧毀身體時似乎沒有被刪除,所以這些舊聯繫人通過聯繫人聽衆進入並導致問題。 –

+1

world-> DestroyBody破壞所有身體接觸。看看它的代碼:http://pastebin.com/cKJDfN6c(v2.2.1)。我認爲,你混在一起(例如,摧毀另一個身體) – Pavel

回答

1

問題是我創建了兩個相同的物體,我不知道,並傳遞給它們兩個相同的用戶數據。當第一個主體與相應的用戶數據(幷包含對象)一起銷燬時,第二個主體仍在創建聯繫點,並且由於與主體關聯的用戶數據已被釋放,所以遇到了所描述的問題。

將NULL設置爲刪除前的主體的userdata似乎沒有工作,因爲當發生崩潰時,調試器實際上向我展示了沒有將用戶數據設置爲NULL的第二個主體。我花了這麼長時間才發現它的原因是因爲代碼在容器對象中有一個繼承結構,這使得很難發現兩個主體正在創建。

原來這是一個錯誤,不能用我發佈的代碼解決,儘管Tomasz和Pavel的回答並沒有導致我解決這個問題,我必須相信他們花時間在至少嘗試幫助。謝謝你們倆。

1

從我看到的box2d身體的破壞與所有這一切無關。 GetUserData返回創建主體時傳入的內容,這可能是垃圾。你食客刪除它或你傳入null。如果你可以提供創建和銷燬機構的代碼,我可能會告訴你更多。

如果身體將是無效的,那麼該計劃很可能會崩潰:

contact->GetFixtureA()->GetBody(); 

或bodyB部分。

+0

你是對的,當創建主體時,我將UserData設置爲包含主體的對象。即Object類包含b2Body * body的成員。所以正文被分配了這個對象,這就是爲什麼上面的代碼希望GetUserData()返回一個Object對象(對這裏的可怕命名感到抱歉)。該對象確實被設置爲被銷燬,實際上對象的析構函數是在DestroyBody(body)完成的。我的問題是,我不希望這種聯繫已經存在,因爲在該步驟之外刪除了主體和用戶數據。 –

+0

這可能是一個愚蠢的問題,但是你正在調試模式下運行它,並且你在box2d世界步驟之外調用world-> DestroyBody(body)?在調試模式下,如果您試圖在聯繫人偵聽器中調用world-> DestroyBody(body),程序應該聲明,因爲在世界步驟中不允許銷燬box2d對象。在釋放模式中,如果你嘗試在世界步驟內摧毀身體,則身體根本不會被移除。所以這意味着包裝box2d主體的對象被破壞,主體和監聽者仍然在世界中。 – LemonMooseTom

+0

我沒有在調試模式下運行,但世界 - > DestroyBody(body)是在世界之外完成的 - 這是在世界步驟調用和ClearForces調用之後完成的。如果我從我的理解中摧毀了一個這樣的機構,那麼該機構的所有聯繫人都將被刪除,這可能是一個錯誤的假設嗎? –

相關問題