0

这是我一直想解决的问题,尽管我永远找不到解决它的方法。我想我可能遗漏了一些东西,但我似乎找不到什么。

我正在尝试从 b2World 中销毁实体,我在各种教程中看到,当他们在 box2d 中使用调试绘图破坏对象时,形状也会被破坏。出于某种原因,当我这样做时:

world.DestroyBody(_body)它似乎没有做任何事情。形状停留在屏幕上。

以前有人遇到过这个问题吗?这让我很担心,因为玩游戏一段时间后,我想要破坏的所有对象都保留在屏幕上,并且仍然会记录碰撞,这确实会延迟游戏。

任何帮助将非常感激,

谢谢,
威尔

编辑:[已解决] 谢谢大家,这很有意义。

4

2 回答 2

6

我自己在一些项目中遇到过这个问题。我认为当您尝试删除 Box2D 引擎“正在使用”的主体时会发生这种情况。我已经通过将要销毁的实体添加到列表中来解决它,然后在下一次渲染之前将它们销毁。

// add body to list if it should be removed
if(shouldRemoveBody)
{
    _removeList.push(bodyToRemove);
}

// start next render with a check
if(_removeList.length > 0)
{
    // remove all bodies in list
}
于 2010-11-27T18:44:29.370 回答
3

补充一下 Mattias 所说的,我做了他所做的同样的事情,将对象推送到 ToBeRemoved 列表。

我为场景中的每个图形精灵都有一个演员类,这里有一些代码:

public class Actor
{
    protected var m_body:b2Body;
    protected var m_sprite:DisplayObject;

    public function Actor(body:b2Body, sprite:DisplayObject)
    {
        this.m_body = body;
        this.m_sprite = sprite;
    }

    public function destroy():void
    {
        // remove sprite
        m_sprite.parent.removeChild(m_sprite);

        // remove physical body
        GlobalVars.world.DestroyBody(m_body);
    }
}

每当我想销毁一个对象时,我只需调用 Actor 的 destroy 方法。

请注意,此类的字段是受保护的,因此我们可以通过子角色对其进行扩展。

这样,它工作顺利。

于 2010-11-27T20:31:24.937 回答