0

getContactList返された連絡先の一部が実際には連絡先ではないようで、問題が発生しています。

関連コード:

    List < Contact > contacts = theBall.body.getWorld().getContactList(); //get all contacts in current world
    if (contacts.size() == 0) selected = -1; // if there are no contacts, set selected to -1, meaning no menu item is selected

    /* loop through all contacts */
    for (Contact con: contacts) {
        Fixture fixtureA = con.getFixtureA();
        Fixture fixtureB = con.getFixtureB();
        LogapPlatform lplat = LogapUtils.cast(fixtureA.getBody().getUserData(), fixtureB.getBody().getUserData(), LogapPlatform.class);
        LogapBall lball = LogapUtils.cast(fixtureA.getBody().getUserData(), fixtureB.getBody().getUserData(), LogapBall.class);

        /* check if the contact is between a LogapBall object and a LogapPlatform object */
        if (lball != null && lplat != null) {
            /* if true, determine which of the five menu platforms the ball has been placed on top of */
            for (int i = 0; i < LogapLevel.ctrPlat.size(); i++) {
                if (lplat.equals(LogapLevel.ctrPlat.get(i)) && (lball.getPos().y > lplat.getPos().y)) {
                    selected = (int) Math.floor(i / 5); // set selected to the "id" of the selected menu platform
                }
            }
        } else {
            selected = -1; // if false, set selected to -1
        }
    }

    /* "NEW GAME" is the only menu item currently implemented. its "id" = 2 */
    if (selected == 2)
        LogapGame.font.setColor(Color.YELLOW); // if the ball is placed on top of the menu platform for NEW GAME, set the font color of the text to yellow
    else
        LogapGame.font.setColor(Color.PINK); // else, keep the text pink

     /* draw the text on the screen */
     if (logLev.menuLevel) {
        LogapGame.font.draw(batch, "NEW GAME", 135, 150);
        LogapGame.font.setColor(LogapGame.GRAY_192);
    }

このコードの動作 (および私が抱えている問題) を確認するために、説明するビデオ サンプルを次に示します (私は Box2DDebugRenderer を有効にしています)。

http://www.youtube.com/watch?v=RcHwt4b4lt0

すでにお気づきかもしれませんが、私が抱えている問題は、ボールがまだプラットフォームに接触していないにもかかわらず、テキストが黄色に変わることです。ボールがプラットフォームに接触したときにのみ、テキストが黄色に変わるはずです。彼らが実際に接触していないかどうか疑問がある場合は、ここにクローズアップがあります:

サンプル http://static.rateyourmusic.com/lk/l/w/02413fc8b4aef5d9f37c3b12420d4a2d/4870735.png

2 つのオブジェクトがまだ接触していないのに、テキストの色が変わる理由について何か考えはありますか?

PS - なぜ私が衝突リスナーを使用しないのか疑問に思っている人のために、まあ、私はそうです。この特定のロジックではありません。コリジョン リスナーでいくつかの癖に遭遇したので、ゲーム内のオブジェクトの動作の一部について、このように連絡先を手動でクエリすることにしました。

4

1 に答える 1

0

libGDX で Box2D を使用したことはありませんが、他のエンジン (通常は C++ ベースのエンジン) で広く使用しており、大きな違いはありません。

私が最初に受けた質問は、「発生している衝突に関する情報を取得するために、コンタクト リスナーのコールバックを使用しないのはなぜですか?」というものでした。

GetContactList は、可能性のあるすべての連絡先を返します。これは、AABB の 2 つの物体が貫通したことを意味しますが、必ずしもフィクスチャが衝突したとは限りません。

そのようなものには、一般的に連絡先リスナーを使用することをお勧めします。ここで衝突と接触リスナーについてもう少し読むことができます: iForce2D Box2D C++ チュートリアル - 衝突の解剖学

于 2013-07-26T15:32:52.360 に答える