2017-02-28 20 views
0

我試過尋找解決方案,無處不在這個問題。我也嘗試了許多不同的方法來嘗試和自己解決這個問題,但沒有任何工作。刪除Box2d中的正文 - C++

每當我嘗試從世界中刪除一個正文時,我在Box2d的IsLocked方法中出現讀訪問衝突。

我已經嘗試創建一個向量列表,然後刪除所有在該列表中的世界的身體。在刪除之前,我一定要檢查我是不是正在走向世界,並且我的列表中沒有重複內容,並且世界沒有被鎖定。

我將它們添加到列表中,像這樣:

for (size_t i = 0; i < m_PlankObjects.size(); i++) 
{ 
    m_Game->m_DestroyObjectList.push_back(m_PlankObjects[i].GetBody()); 
} 

這是GetBody()方法:

b2Body * GameObject::GetBody() 
{ 
    return m_Body; 
} 

m_Body就像這樣定義:

b2Body* m_Body; 

,毀壞像這樣:

if (m_UpdateWorld) 
{ 
    World.Step(1/60.f, 8, 3); 
} 
else 
{ 
    if (!World.IsLocked()) 
    { 
     if (m_DestroyObjectList.size() != 0) 
     { 
      for (size_t i = 0; i < m_DestroyObjectList.size(); i++) 
      { 
       World.DestroyBody(m_DestroyObjectList[i]); 
       m_DestroyObjectList.erase(m_DestroyObjectList.begin() + i); 
      } 
     } 
    } 
} 
+0

我不確定這裏發生了什麼,我的box2d知識有點生疏。我曾經遇到過一個問題,因爲銷燬一個b2Body會導致EndContact回調被調用(在下一個模擬步驟中)。如果你不期望,你可以讀取已經被刪除的回調中的指針。 – zett42

+0

@ zett42雖然我還沒有爲任何聯繫人偵聽器實現任何代碼。這是否意味着我必須執行並處理它? –

+0

我不這麼認爲。如果你還沒有使用它,它不應該有影響。 – zett42

回答

2

經過一夜的睡眠,我回到問題並調試它。我發現我沒有清理m_PlankObjects數組,因此在下一次遊戲循環更新中,它再次被訪問,但由於沒有可訪問的實體,Box2d正在拋出異常。

+0

很好,你可以自己找到它。 「睡上一晚」應該是一個有效的答案! ;-) – zett42