【问题标题】:Crash when destroying bodies破坏尸体时崩溃
【发布时间】:2023-03-29 14:23:01
【问题描述】:

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

【问题讨论】:

  • 只破坏关节是否还有问题?您也可以查看 World.java:507 :)
  • 第三次,是的,我已经尝试破坏关节。我还查看了 World.java:507。两者都写在问题中:-)
  • 问题是“在移除之前移除与特定身体相关的所有关节没有帮助”。我在问你是否尝试过只破坏关节(并留下尸体)。
  • 我明白了。我还没有尝试过。我希望这将毫无问题地工作,因为在关节被破坏后引擎崩溃了很长时间(就计算机而言)。
  • 我刚刚试过,移除所有关节不会导致崩溃。

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


【解决方案1】:

我认为您还必须首先删除物理连接器,并且您必须在更新方法中执行所有这些操作。 所以,删除顺序是 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++;
        }
    }); 

【讨论】:

  • 我没有尝试破坏物理连接器,但这肯定不会导致物理引擎崩溃。有时间我会试试的。
  • 嗯,破坏连接器不会导致游戏崩溃。
  • 谢谢,看来我们正在取得进展。现在它在 com.badlogic.gdx.physics.box2d.World.destroyBody(World.java:154) 处出现 NullPointerException 失败。对应的行包含:this.bodies.remove(body.addr);
  • 要删除的正文检查它是否为空。我认为那东西还剩下。
  • 似乎有时候尸体确实是空的。我添加了一个条件,在尝试删除之前检查它们,它突然起作用了。不过让我担心的是,我不知道为什么身体可以是空的。当我不了解自己的代码如何工作时,我讨厌它。无论如何,非常感谢 Siddharth 的努力,我接受了答案。
【解决方案2】:

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

【讨论】:

  • 试过了,没用。见最后一段。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-16
  • 2021-01-02
  • 1970-01-01
  • 2014-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多