2017-02-28 63 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