我想以这样一种方式创建一个联系人监听器,以便我可以在来自不同类的精灵相遇时创建一个联合。我发现了一个有用的问题和答案,它帮助了我 - Getting the world's contactListener in Box2D。建议使用以下代码和内容:
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!!
为此,您需要通过联系人侦听器函数使thingThatTouched列表可见,因此它可以是全局变量,也可以在联系人侦听器类中设置指向它的指针,或者也许有一个全局函数返回指向列表的指针。
我正在使用Cocos2d并且不太了解C ++。我如何
std::vector< std::pair<b2Fixture*, b2Fixture*> > thingsThatTouched;
在ContactListener.h文件中?它在Cocos2d中有何不同?感谢。
答案 0 :(得分:0)
您可以将此列表存储在单个类中,然后您可以从任何地方访问它,甚至是C ++代码。这样的事情:
NSArray* things = [SomeSingleton sharedSingleton].thingsThatTouched;
答案 1 :(得分:0)
将它放在头文件中:
typedef std::pair<b2Fixture*, b2Fixture*> fixturePair;
typedef std::vector<fixturePair> fixturePairVector;
extern fixturePairVector g_touchingFixtures;
然后在您需要使用列表的位置包含标题。您还需要在某个源文件(.mm或.cpp)中使用它,只需一次:
fixturePairVector g_touchingFixtures;
原因是,typedef不是必需的,但如果你不喜欢看太多错误的括号,它们可能会有所帮助。