2

当我破坏一个由多个通过关节连接的物体组成的物体时,我的应用程序崩溃而没有错误。当然,我做了一些研究,发现当物理引擎计算步数时破坏物体时会发生这种情况。所以我只是将实体添加到列表中并在 onUpdate() 中销毁它们,但这并没有帮助。有趣的是,即使在 onUpdate() 之外,破坏简单的实体也很有效,而且从未导致崩溃。

没有错误输出,就在我设法捕捉到一个说问题是 World.java 中的 NullPointerException 的第 507 行时。令人惊讶的是,我发现了以下内容:

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)
...
4

2 回答 2

3

我认为您还必须首先删除物理连接器,并且您必须在更新方法中执行所有这些操作。所以,移除顺序是 1. 从身体上移除关节 2. 移除物理连接器 3. 从世界上摧毁身体和其他你必须手动管理的必要事情,我没有提到。

编辑:我为你找到了另一件事。你必须实现可运行的处理程序来破坏身体和关节。以下代码对我有用,我看到了如何删除正文。

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++;
        }
    }); 
于 2012-06-02T07:17:51.857 回答
1

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

于 2012-06-01T16:25:27.073 回答