サイトのトップへ戻る

AndEngineドキュメント 日本語訳

Body同士などの衝突/接触を制御する:

物理演算ベースのゲームのほとんど全てにおいて、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への参照として二つのオブジェクトを作成します。
  • 次の手順では、contact listener を PhysicsWorldに登録します。
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の)が違うこともありえます。