在box2d中,我可以在body被销毁后调用body.isActive()吗?

In box2d, can I call body.isActive() after body was destroyed?

在我的游戏中,我正在实现 save/load 状态功能,它可以恢复世界的一部分,而地面 body 保持不变。

因此,当我单击加载按钮时,我只保存演员的坐标,然后从舞台上移除所有演员,然后 re-create 使用保存的坐标再次舞台。

如果 actor 拥有一个 box2d body,它会在移除时调用 world.destroyBody()。

作为游戏玩法的结果,我可能会让多个演员引用相同的内容 body。

因此,当我查看演员列表并将它们一一删除时,可能其中一些拥有的 body 已经被销毁(因为它是共享的)。

我可以使用 body.isActive() 检查这个 body 是否已经被销毁或者那是不合法的,因为 body 被销毁并且永远不应该从 java又是?

看起来 body.isActive() 在 body 被删除后给出了一个错误,或者它是某种副作用?我是在问问题吗(比如著名的 box2d 随机崩溃 not-so-helpful 消息)在已经被破坏的 body 上调用任何函数?

我可以使用这样的代码吗:

//since after ball is attached to magnet, they share 
// a body, and it might be that body is already dropped
if (body.isActive()) { 
            body = world.destroyBody(body);
        } 
        body = null;

组织大规模投放和重建部分世界的最佳方式是什么?

好的,这在我的桌面上运行良好,即在被破坏的对象上调用 body.isActive() returns false,并且不会导致任何稳定性问题。

但是当部署到 android phone 时,body.isActive() 调用被破坏的主体 returns true.

因为我是新手,所以不想在那里定义规则,但看起来如下所示:

我想说的是,在 body 被销毁后(它在本机代码中被销毁),您对旧引用所做的任何调用的行为都是未定义的或导致 immediate/later Box2d 崩溃。

所以我不会对死的 box2d 引用做任何调用,因此我们不能在 body 被销毁后使用 body.isActive()。

最佳做法是在您销毁一具尸体后立即将您的引用分配给 null。有一个 destroyBody() 方法可以破坏 body 并且总是 returns null 允许你在一行中完成它:

public Body destroyBody(final Body body) {
 world.destroyBody(body); 
 return null; 
} 
....
body = destroyBody(body); //destroys body and set it to null in one line