連絡先リスナーは、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