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