2017-02-28 3 views
0

나는이 문제에 대한 해결책을 찾지 않으려 고 노력했다. 또한이 문제를 직접 해결하기 위해 여러 가지 방법을 시도했지만 아무 것도 효과가 없었습니다.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); 
      } 
     } 
    } 
} 
+0

나는 여기서 무슨 일이 일어나고 있는지 잘 모르겠다. 내 box2d 지식은 약간 녹슬었다. b2Body를 파괴하면 EndContact 콜백이 호출되어 (다음 시뮬레이션 단계에서) 문제가 발생했습니다. 예상하지 못한다면 이미 삭제 된 콜백의 포인터를 읽을 수 있습니다. – zett42

+0

@ zett42 연락처 청취자를위한 코드를 구현하지 않았습니다. 이것은 구현하고 처리해야한다는 것을 의미합니까? –

+0

나는 그렇게 생각하지 않는다. 아직 사용하지 않으면 영향을 미치지 않습니다. – zett42

답변

2

야간의 수면 후에 나는 문제로 돌아가 그것을 디버깅했다. 나는 m_PlankObjects 배열을 지우지 않았다는 것을 알았고 다음 게임 루프 업데이트에서 다시 액세스 할 수 있었지만 액세스 할 바디가 없었기 때문에 Box2d는 예외를 던지고있었습니다.

+0

스스로 찾아 낼 수있어서 좋았습니다. "잠을 자고 밤새도록"유효한 대답이되어야합니다! ;-) – zett42