2

ジョイントで接続された複数のボディで構成されるオブジェクトを破棄すると、アプリケーションがエラーなしでクラッシュします。もちろん、私はいくつかの調査を行い、物理エンジンがステップを計算している間にボディを破壊すると、これが発生することを発見しました. そのため、ボディをリストに追加して onUpdate() で破棄しましたが、それは役に立ちませんでした。面白いことに、単純なボディの破棄は onUpdate() の外部でも魅力的に機能し、クラッシュを引き起こすことはありません。

エラー出力はありませんでしたが、問題は World.java の 507 行目の NullPointerException であるというメッセージをなんとかキャッチできました。驚いたことに、次のことがわかりました。

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

誰かが何が起こっているのか教えてもらえますか? 私は死体を一度に 1 つずつ破壊することさえしました。

if (!destroyList.isEmpty()){
    Body b = destroyList.get(0);
    destroyList.remove(0);
    mPhysicsWorld.destroyBody(b);
}

問題は解決しません。

注: 私が破壊しようとしているオブジェクトは、WeldJoints によって 1 つの中心ボディに接続された複数のボディで構成されています。体が重なっているので、負の 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

最初に物理コネクタも削除する必要があり、これらすべてをupdateメソッドで実行する必要があると思います。したがって、削除シーケンスは次のとおりです。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 に答える