-1

タッチ/物理学の例から構築された、遊んでいる非常に単純なゲームがあります。基本的に何が起こるかというと、画面に触れるとボディのある形を作り、box2d で跳ね回ります。今、私がやりたいのは、その特定のスプライトが何かと衝突したときに、現在のフレームを一瞬「1」に変更してから元に戻すことです。

ある程度は機能していますが、スプライトが何かと衝突するたびに、最後に作成されたスプライトのみが更新されます。これは私の衝突検出です:

private ContactListener createContactListener()
    {
        ContactListener contactListener = new ContactListener()
        {

            @Override
            public void beginContact(Contact contact) {
                face.animate(new long[] { 50, 10}, new int[] {1, 0}, 0);; 


            }

            @Override
            public void endContact(Contact contact) {

            }

            @Override
            public void preSolve(Contact contact, Manifold oldManifold) {

            }

            @Override
            public void postSolve(Contact contact, ContactImpulse impulse) {

            }

        };
        return contactListener;
    }

私が言ったように、私は近くにいると思いますが、それを理解できないようです。ありがとうございました!

4

1 に答える 1

0

接触リスナーでは、衝突する 2 つのボディに対して個別に呼び出されることはありません。つまり、BodyA が BodyB と衝突すると、1 つのコンタクト リスナー コールバックだけが呼び出されるということです。連絡先リスナーが登録されているクラスのインスタンスのみを更新します。

あなたがする必要があるのは、リスナーを登録するときに、顔が属するクラスのインスタンスを userData として渡すことです (それぞれに対して)。次に、次の方法で Contact からインスタンスを取得できます。

FaceClass* fcA = contact.GetFixtureA().GetBody().GetUserData();
FaceClass* fcB = contact.GetFixtureB().GetBody().GetUserData();

次に、取得したインスタンス内で必要なことを行う関数を呼び出します。おそらく「updateOnCollision」のようなものです。

fcA.updateOnCollision();
fcB.updateOnCollision();

PS私は頭からコードを書きましたが、私のJaveは悪いので、少し調整が必要かもしれません.

于 2013-07-29T09:18:40.550 に答える