0

cocos2DとBox2Dを使ってMacOS用のゲームを書いています。b2ContactListener次のように、私の世界にサブクラスを追加しました。

contactListener = new ContactListener();
world->SetContactListener(contactListener);

これは完全に機能しますが、現在連絡先リスナーを直接参照していない他のクラスから連絡先リスナーにアクセスするための最良の/受け入れられている方法がわかりません。

私はそれを必要とする他のクラスへの参照を渡すことができることを知っていますが、私が疑問に思っていたのは、より良い方法があるかどうかです。より具体的には、これを行う方法は見つかりませんが、これに相当するものはありますか?

world->GetContactListener();

Box2Dで?

私がこれを行おうとしている理由は、すべてをメインのゲームプレイに入れるのではなく、ゲームロジック(つまり、ボディがコンタクトリスナーからの情報に基づいてジャンプできるかどうか)を関連するクラス自体に移動したいからです。クラス。

ありがとう!

4

2 に答える 2

3

連絡先リスナーは、BeginContact、EndContact、PreSolve、PostSolveの4つの関数のエントリポイントとして機能します。通常、メンバー変数がないため、取得する理由がありません。取得するものがないためです。

ワールドステップ中にこれらの関数の1つが呼び出されると、タッチした/タッチを停止した2つのものなどをメモできますが、タイムステップが完了するまで、ワールド内の何も変更しないでください。

この質問の核心は、どのようなものに触れたかを「メモする」ために使用される方法だと思いますが、それは本当にあなた次第であり、必要な情報の種類によって異なります。たとえば、BeginContactのみに関心がある場合、最も簡単な方法は、接触した2つのフィクスチャをペアのリストとして保存することです。

std::vector< std::pair<b2Fixture*, b2Fixture*> > thingsThatTouched;

//in BeginContact
thingsThatTouched.push_back( make_pair(contact->GetFixtureA(), contact->GetFixtureB()) );

//after the time step
for (int i = 0; i < thingsThatTouched.size(); i++) {
    b2Fixture* fixtureA = thingsThatTouched[i].first;
    b2Fixture* fixtureB = thingsThatTouched[i].second;
    // ... do something clever ...
}
thingsThatTouched.clear(); //important!!

これを機能させるには、thingsThatTouchedリストを連絡先リスナー関数から表示する必要があります。これにより、グローバル変数にするか、連絡先リスナークラスでそのリストへのポインターを設定するか、グローバル関数を使用することができます。リストへのポインタを返します。

何が触れなくなったかなど、より多くの情報を追跡する必要がある場合、または触れたときにどの程度の影響があったかに基づいてタイムステップの後に何かを行う必要がある場合は、もう少し作業が必要になり、より具体的になります。これらのチュートリアルが役立つ場合があります。

これは、BeginContact / EndContactを使用して、身体が触れている他のもののリストを更新し、それを使用して、プレーヤーがいつでもジャンプできるかどうかを判断し ます。http ://www.iforce2d.net/b2dtut/jumpability

これは、同様の方法を使用して、現在車のタイヤの下にある表面のタイプを調べ、表面にどの程度の摩擦があるかを判断し ます。http ://www.iforce2d.net/b2dtut/top-down-car

これは、PreSolveを使用して、衝突の速度に基づいて、2つのボディ(矢印とターゲット)が衝突したときに互いにくっつくかどうかを決定します。実際の「くっつく」処理は、タイムステップが終了した後に実行されます: http ://www.iforce2d.net/b2dtut/sticky-projectiles

于 2012-06-05T16:47:28.123 に答える
0

GetContactList他の場所で行う必要がある場合は、イテレータを使用してすべての連絡先に電話して処理するだけでよいと思います

于 2012-06-03T09:35:04.837 に答える