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

问题描述 投票:0回答:1

在我的游戏中,我正在实现保存/加载状态功能,它可以恢复世界的一部分,保持地面体不受影响。

因此,当我单击加载按钮时,我只保存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;

什么是组织大规模下降和重建世界的最佳方式?

java libgdx box2d
1个回答
0
投票

好吧,这在我的桌面上运行正常,即调用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
© www.soinside.com 2019 - 2024. All rights reserved.