2017-02-28 16 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; 

およびdestroyそうですね:

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コールバックが呼び出される可能性があるため、問題が1回発生しました。期待していない場合は、すでに削除されているコールバック内のポインタを読み取ることができます。 – zett42

+0

@ zett42私は連絡先リスナーのコードを実装していません。これは私が実装し、それを処理する必要がありますか? –

+0

私はそうは思わない。あなたがまだそれを使用していない場合、それは影響を与えるべきではありません。 – zett42

答えて

2

夜の眠りの後、私は問題に戻り、デバッグしました。私はm_PlankObjects配列をクリアしていないことを知ったので、次のゲームループ更新で再びアクセスされましたが、アクセスするボディがないので、Box2dは例外をスローしていました。

+0

あなた自身でそれを見つけることができました。 "それ以上の夜を眠れ"は、SOの有効な答えになるはずです! ;-) – zett42

関連する問題