物理演算ベースのゲームのほとんど全てにおいて、Body同士の衝突/接触を制御することは本当に重要なことです。 これは ContactListenerを使って行います。 body Aとbody Bが接触した後にアクションを実行したいとしましょう。 ContactListenerを使うことで、簡単にできます。
最初の手順では、新しい contact listenerを作成します:
private ContactListener createContactListener() { ContactListener contactListener = new ContactListener() { @Override public void beginContact(Contact contact) { final Fixture x1 = contact.getFixtureA(); final Fixture x2 = contact.getFixtureB(); } @Override public void endContact(Contact contact) { } @Override public void preSolve(Contact contact, Manifold oldManifold) { } @Override public void postSolve(Contact contact, ContactImpulse impulse) { } }; return contactListener; }ご覧のように、 beginContact と endContactという二つの重要なものがあります。 またbeginContact内で、 接触が発生するBodyへの参照として二つのオブジェクトを作成します。
mPhysicsWorld.setContactListener(createContactListener());
前の記事 - CREATING BODIES -で述べたように、
ユーザーデータを使ってBodyに'識別子を設定する'ことができます。それから contact listener内のユーザーデータを比較して、アクションを実行します。
前の記事を確認するのが面倒な場合は、以下のようにしてbodyにユーザーデータを設定できます:
yourBody.setUserData("player");
これで、beginContact内で確認を行い、ユーザーデータ"player"を持つbody Aとユーザーデータ"monster"を持つbody が接触した時にアクションを実行することができます。
if (x2.getBody().getUserData().equals("player")&&x1.getBody().getUserData().equals("monster")) { Log.i("CONTACT", "BETWEEN PLAYER AND MONSTER!"); }
これで完了です。このシンプルで簡単な方法で、他のBodyに接触したタイミングを確認してアクションを実行することができます。
重要な注意事項: 上記の例では確認は一回のみ行っています。今回はx2 はプレイヤーのBodyでx1はモンスターのBodyとしています。 その処理が異なる(逆になる)場合もあります。 つまり、場合によっては確認を二回行い、アクションは同じでも 順序(x2 と x1の)が違うこともありえます。