破坏尸体时崩溃

时间:2012-05-31 14:12:13

标签: android box2d andengine native-code physics-engine

当我销毁由关节连接的几个物体组成的物体时,我的应用程序崩溃而没有错误。当然,我做了一些研究,发现当物理引擎计算一个步骤时会破坏物体。所以我只是将主体添加到列表中并在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)
...

2 个答案:

答案 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)

这只是一个想法,但也许你应该在破坏尸体之前破坏关节。