0

異なるクラスのスプライトが出会ったときにジョイントを作成できるように、コンタクトリスナーを作成したいと思います。私は私を助けてくれた有用な質問と答えを見つけました-部分的にBox2Dで世界のcontactListenerを取得します。推奨される場合は、次のコードと手順:

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リストを連絡先リスナー関数から表示する必要があります。これにより、グローバル変数にするか、連絡先リスナークラスでそのリストへのポインターを設定するか、グローバル関数を使用することができます。リストへのポインタを返します。

私はCocos2dを使用していますが、C++についてはあまり知りません。Cocos2dで「thingsThatTouchedリストを連絡先リスナー関数から表示する」にはどうすればよいですか?したほうがいい

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

ContactListener.hファイルにありますか?Cocos2dではどのように違いますか?ありがとう。

4

2 に答える 2

0

このリストをシングルトン クラスに格納すると、どこからでも (C++ コードからでも) アクセスできます。そんな感じ:

NSArray* things = [SomeSingleton sharedSingleton].thingsThatTouched;
于 2012-07-11T16:03:18.057 に答える
0

これをヘッダーファイルに入れます:

typedef std::pair<b2Fixture*, b2Fixture*> fixturePair;
typedef std::vector<fixturePair> fixturePairVector;

extern fixturePairVector g_touchingFixtures;

次に、リストを使用する必要がある場所にヘッダーを含めます。また、これをソース ファイル (.mm または .cpp) のどこかに 1 回だけ含める必要があります。

fixturePairVector g_touchingFixtures;

もちろん、typedef は必要ありませんが、間違った種類の括弧をあまり見たくない場合に役立ちます。

于 2012-07-13T11:26:45.817 に答える