在我的游戏中,我正在实现保存/加载状态功能,它可以恢复世界的一部分,保持地面体不受影响。
因此,当我单击加载按钮时,我只保存actor的坐标,然后从舞台中删除所有actor,然后使用保存的坐标重新创建舞台。
如果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;
什么是组织大规模下降和重建世界的最佳方式?
好吧,这在我的桌面上运行正常,即调用body.isActive()在被破坏的对象上返回false,并且不会导致任何稳定性问题。
但是当部署到android手机时,body.isActive()调用被破坏的主体返回true。
不试图在那里定义规则,因为我是新手,但它看起来如下:
我会说,在身体被摧毁之后(并且它在本机代码中被摧毁),你对旧引用进行的任何调用的行为都是未定义的,或导致立即/稍后的Box2d崩溃。
所以我不会对死的box2d引用进行任何调用,因此在破坏body之后我们不能使用body.isActive()。
最好的做法是在你摧毁一个体后立即将你的引用分配给null。有一个方法destroyBody()破坏body并始终返回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