当我销毁一个由多个由关节连接的实体组成的对象时,我的应用程序会毫无错误地崩溃。当然,我做了一些研究,发现当一个人在物理引擎计算一步的时候破坏了身体,就会发生这种情况。所以我只是将尸体添加到一个列表中,然后在onupdate()中销毁它们,但这没有帮助。有趣的是,即使在onupdate()之外,摧毁简单的身体也能起到魅力的作用,而且从未造成过崩溃。
没有错误输出,就在我设法捕捉到一条消息,说问题是world.java的第507行出现了nullpointerexception。令人惊讶的是,在那里我发现了以下几点:

public boolean isLocked()
    {
        return jniIsLocked( addr );
    }

有人能告诉我怎么回事吗?我甚至一次一具地摧毁尸体:
if (!destroyList.isEmpty()){
    Body b = destroyList.get(0);
    destroyList.remove(0);
    mPhysicsWorld.destroyBody(b);
}

但问题依然存在。
注:我正在销毁的物体是由几个通过焊接接头连接到一个中心物体的物体组成的。身体重叠,所以我使用负的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)
...

最佳答案

我认为你必须首先移除物理连接器,并且你必须在更新方法中完成所有这一切。
所以,删除顺序是
一。从车身上拆下接头
2.移除物理连接器
三。从世界上摧毁尸体
还有其他必要的事情你必须手动管理,我没有提到。
编辑:我为你找到了另一件事。你必须实现可运行的处理程序来破坏身体和关节。在我看到如何删除body的地方,下面的代码对我很有用。

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++;
        }
    });

10-06 07:18