サイトのトップへ戻る

AndEngineドキュメント 日本語訳

PhysicsWorld と全ての物理オブジェクトを破棄する:

この記事では、全てのPhysicsWorld と全ての物理オブジェクト(Body, Joints など)を破棄する私なりの方法を説明します。 一つのBodyを安全に削除する方法を知りたい場合は、この記事を参照してください - Bodyを安全に削除する方法.



1. PhysicsWorld を削除する:
まず覚えておくべき最も大事なことは、PhysicsWorld の削除はupdate スレッド内で行わなければならないということです。 そうしないと、アプリはクラッシュしたり異常な動作をしたりします。 
public void destroyPhysicsWorld()
{
    engine.runOnUpdateThread(new Runnable()
    {
        public void run()
        {
            Iterator<Body> localIterator = physicsWorld.getBodies();
            while (true)
            {
                if (!localIterator.hasNext())
                {
                    physicsWorld.clearForces();
                    physicsWorld.clearPhysicsConnectors();
                    physicsWorld.reset();
                    physicsWorld.dispose();
                    System.gc();
                    return;
                }
                try
                {
                    final Body localBody = (Body) localIterator.next();
                    GameScene.this.physicsWorld.destroyBody(localBody);
                } 
                catch (Exception localException)
                {
                    Debug.e(localException);
                }
            }
        }
    });
}

見て分かるように、physics worldに作成されたBodyの配列にアクセスして、物理オブジェクトを削除することができます。 (bodies in this case, you can also access array for joints)。配列の範囲分これを繰り返します。

処理を繰り返す間、 hasNext() を使ってbodyが残っているかを確認し、全てのbodyを削除した後で安全にphysics worldを削除します(forceやphysics connectorなどをクリアします)。

ゲームを再スタートする時やゲームプレイscene から離れるなど時は、個人的にはこの方法を使ってSceneから物理オブジェクトを消去しています。