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

时间:2019-04-04 13:05:00

标签: java libgdx box2d

在我的游戏中,我实现了保存/加载状态功能,该功能可以还原世界的一部分,而地面实体则保持不变。

因此,当我单击加载按钮时,我只保存演员的坐标,然后从舞台中删除所有演员,然后使用保存的坐标再次重新创建舞台。

如果actor拥有box2d实体,则移除后会调用world.destroyBody()。

作为一个游戏玩法的结果,我可能会让多个演员引用同一个身体。

因此,当我遍历演员列表并一一删除它们时,对于他们中的某些人来说,可能已经被销毁了(因为它是共享的)。

我可以使用body.isActive()来检查此主体是否已被破坏或不合法,因为主体已被破坏并且永远不应再次从Java取消引用?

看起来好像body.isActive()在放下身体后给出了错误,还是某种副作用?我是否在问问题(例如著名的box2d随机崩溃并显示不那么有用的消息),以调用已经毁坏的物体上的任何函数?

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

//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;

组织大规模掉落并重现世界一部分的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

好吧,这在我的桌面上运行良好,即调用body.isActive()在销毁的对象上返回false,并且不会引起任何稳定性问题。

但是当部署到android手机时,对被破坏的主体的body.isActive()调用将返回true。

由于我是新手,所以没有尝试在其中定义规则,但是看起来像下面的样子:

我要说的是,在销毁主体(并以本机代码将其销毁)之后,您在旧引用上进行的任何调用的行为都是不确定的,否则会导致Box2d立即崩溃。

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

最佳做法是在销毁尸体后立即将您的引用分配为null。拥有方法destroyBody()可以销毁主体并始终返回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