私はこの問題の解決策を探してみました。私も、この問題を自分で解決しようとすると、さまざまなアプローチを試みましたが、何も効果がありませんでした。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);
}
}
}
}
私はここで何が起こっているのか分かりません。私のbox2dの知識は少し錆びています。 b2Bodyを破棄すると(次のシミュレーションステップで)EndContactコールバックが呼び出される可能性があるため、問題が1回発生しました。期待していない場合は、すでに削除されているコールバック内のポインタを読み取ることができます。 – zett42
@ zett42私は連絡先リスナーのコードを実装していません。これは私が実装し、それを処理する必要がありますか? –
私はそうは思わない。あなたがまだそれを使用していない場合、それは影響を与えるべきではありません。 – zett42