【问题标题】:Deleting Body in Box2d - C++在 Box2d 中删除正文 - C++
【发布时间】:2017-02-28 20:23:17
【问题描述】:

我已尝试到处寻找解决此问题的方法,但无济于事。我也尝试了许多不同的方法来尝试自己解决这个问题,但是没有任何效果。

每次我尝试从世界中删除一个实体时,我都会在 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);
            }
        }
    }
}

【问题讨论】:

  • 我不太确定这里发生了什么,而且我的 box2d 知识有点生疏。我曾经遇到过一个问题,因为销毁 b2Body 会导致调用 EndContact 回调(在下一个模拟步骤中)。如果您不希望这样,您可以在该回调中读取一个已被删除的指针。
  • @zett42 我还没有为任何联系人监听器实现任何代码。这是否意味着我必须实施和处理它?
  • 我不这么认为。如果您还没有使用它,它应该不会产生影响。

标签: c++ box2d sfml


【解决方案1】:

睡了一夜之后,我又回到了问题上并对其进行了调试。我发现我没有清除 m_PlankObjects 数组,因此在下一次游戏循环更新中再次访问它,但由于没有要访问的主体,Box2d 抛出异常。

【讨论】:

  • 很好,你可以自己找到它。 “睡一晚”应该是SO的有效答案! ;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多