0

こんにちはスタックオーバーフローコミュニティ!

衝突検出と物理演算に Box2D を使用する Android ゲームに取り組んでいます。現在、基本的なプラットフォーマー システムを実装しています。ジャンプはできますが、小さな不具合があります。次の関数は、プレイヤーが地面にいるかどうかを判断するためのものです。シンプルですね。まあ、プレイヤーが壁のすぐ隣にいない限り、問題なく動作します。その場合、壁がプレイヤーの真下になくても、関数は true を返すため、常にジャンプするだけです。

真下にあるものと衝突していることを確認するために、追加の x チェックを追加しようとしましたが、役に立ちませんでした。

private boolean isGrounded(float deltaTime) {               
    List<Contact> contactList = world.getContactList();

    for(int i = 0; i < contactList.size(); i++) {
        Contact contact = contactList.get(i);
        if(contact.isTouching() && (contact.getFixtureA() == sensorFixture ||
           contact.getFixtureB() == sensorFixture)) {               

            Vector2 pos = body.getPosition();
            WorldManifold manifold = contact.getWorldManifold();
            boolean below = true;
            Vector2 cpoint;
            for(int j = 0; j < manifold.getNumberOfContactPoints(); j++) {
                cpoint = manifold.getPoints()[j];
                below &= (
                            (cpoint.y < pos.y - 0.15f) 
                            && (cpoint.x > pos.x - w/2 + 3f)
                            && (cpoint.x < pos.x + w/2 - 3f)
                        );

                if(below) return true;
            }

            return false;
        }
    }
    return false;
}

それで、isGroundedチェックをより効率的にするために私ができることへの指針を誰かが持っていますか?

前もって感謝します!:)

4

1 に答える 1

1

Box2d には詳しくありませんが、最初に考えたのは、接触しているオブジェクトの向きを確認することです。ドキュメントを簡単に確認すると、WorldManifold には、フィクスチャ A からフィクスチャ B を指すローカル法線を提供する getNormal があることがわかります。そこから、内積を使用して方向を X 軸または Y 軸と比較します。次に、プレイヤーがジャンプできるようにする表面の勾配をしきい値に設定できます。ローカル法線をワールド空間に変換する必要がある場合があります。

ソース:

  • Box2d マニュアル
  • LibGDX ドキュメント
  • 于 2011-12-13T13:59:10.587 に答える