나는이 문제에 대한 해결책을 찾지 않으려 고 노력했다. 또한이 문제를 직접 해결하기 위해 여러 가지 방법을 시도했지만 아무 것도 효과가 없었습니다.Box2d에서 바디 삭제 - C++
전 세계에서 본문을 삭제하려고 할 때마다 Box2d의 IsLocked 메서드에서 읽기 액세스 위반이 발생합니다.
나는 벡터 목록을 만든 다음 그 목록에있는 세계에서 모든 본문을 삭제하려고했습니다. 삭제하기 전에 나는 세계를 밟지 않고 내 목록에 중복이없고 세계가 잠겨 있지 않은지 확인해야합니다.
나는과 같이 목록에 추가 :
b2Body * GameObject::GetBody()
{
return m_Body;
}
m_Body은과 같이 정의된다 :
b2Body* m_Body;
그리고 파괴
for (size_t i = 0; i < m_PlankObjects.size(); i++)
{
m_Game->m_DestroyObjectList.push_back(m_PlankObjects[i].GetBody());
}
이는 또는 getBody() 메소드입니다 좋아요 :
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 콜백이 호출되어 (다음 시뮬레이션 단계에서) 문제가 발생했습니다. 예상하지 못한다면 이미 삭제 된 콜백의 포인터를 읽을 수 있습니다. – zett42
@ zett42 연락처 청취자를위한 코드를 구현하지 않았습니다. 이것은 구현하고 처리해야한다는 것을 의미합니까? –
나는 그렇게 생각하지 않는다. 아직 사용하지 않으면 영향을 미치지 않습니다. – zett42