当我销毁由关节连接的几个物体组成的物体时,我的应用程序崩溃而没有错误。当然,我做了一些研究,发现当物理引擎计算一个步骤时会破坏物体。所以我只是将主体添加到列表中并在onUpdate()中销毁它们,但这没有用。有趣的是,即使在onUpdate()之外,破坏简单的身体就像魅力一样,并且永远不会导致崩溃。
没有错误输出,只是一次我设法在第507行抓到一个说问题是World.java中的NullPointerException。令人惊讶的是,我发现了以下内容:
public boolean isLocked()
{
return jniIsLocked( addr );
}
有人能告诉我可能会发生什么吗?我甚至一次一个地摧毁尸体:
if (!destroyList.isEmpty()){
Body b = destroyList.get(0);
destroyList.remove(0);
mPhysicsWorld.destroyBody(b);
}
问题仍然存在。
注意:我正在摧毁的物体是由WeldJoints连接到一个中心体的几个物体组成的。身体重叠,所以我使用负groupIndex来防止它们相互碰撞。在移除之前移除与特定身体相关联的所有关节并没有帮助。 错误输出:
05-31 15:32:02.486: W/dalvikvm(927): JNI WARNING: JNI method called with exception raised
05-31 15:32:02.497: W/dalvikvm(927): in Lcom/badlogic/gdx/physics/box2d/World;.jniStep (JFII)V (CallBooleanMethodV)
05-31 15:32:02.497: W/dalvikvm(927): Pending exception is:
05-31 15:32:02.506: I/dalvikvm(927): Ljava/lang/NullPointerException;:
05-31 15:32:02.526: I/dalvikvm(927): at com.badlogic.gdx.physics.box2d.World.contactFilter(World.java:507)
05-31 15:32:02.526: I/dalvikvm(927): at com.badlogic.gdx.physics.box2d.World.jniStep(Native Method)
05-31 15:32:02.536: I/dalvikvm(927): at com.badlogic.gdx.physics.box2d.World.step(World.java:298)
...
答案 0 :(得分:3)
我认为你必须首先删除物理连接器,你必须在更新方法中做所有这些事情。 所以,删除顺序是 1.从身体上取下关节 2.删除物理连接器 3.摧毁世界的身体 和其他必要的事情,你必须手动管理,我没有提到。
编辑:我发现了另一件事。你必须实现runnable处理程序来破坏主体和关节。以下代码适用于我所看到的如何删除正文。dRunnableHandler.postRunnable(new Runnable() {
@Override
public void run() {
// destroy the bullet body
PhysicsConnector physicsConnector = gameObject
.getPhysicsWorld().getPhysicsConnectorManager()
.findPhysicsConnectorByShape(Bullet.this);
gameObject.getPhysicsWorld().unregisterPhysicsConnector(
physicsConnector);
gameObject.getPhysicsWorld().destroyBody(bulletBody);
particleSystem.setParticlesSpawnEnabled(false);
gameObject.getEngine().getScene().detachChild(Bullet.this);
gameObject.removeBulletCounter++;
}
});
答案 1 :(得分:1)
这只是一个想法,但也许你应该在破坏尸体之前破坏关节。