在来自不同类的精灵相遇时创建联系人侦听器

时间:2012-07-11 15:44:22

标签: cocos2d-iphone box2d box2d-iphone

我想以这样一种方式创建一个联系人监听器,以便我可以在来自不同类的精灵相遇时创建一个联合。我发现了一个有用的问题和答案,它帮助了我 - 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 ++。我如何在Cocos2d中“使联系人监听器功能中的东西可以看到”??应该

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

在ContactListener.h文件中?它在Cocos2d中有何不同?感谢。

2 个答案:

答案 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不是必需的,但如果你不喜欢看太多错误的括号,它们可能会有所帮助。