在我的游戏中,我实现了保存/加载状态功能,该功能可以还原世界的一部分,而地面实体则保持不变。
因此,当我单击加载按钮时,我只保存演员的坐标,然后从舞台中删除所有演员,然后使用保存的坐标再次重新创建舞台。
如果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;
组织大规模掉落并重现世界一部分的最佳方法是什么?
答案 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