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)中包含它,只需一次:

fixturePairVector g_touchingFixtures;

当然,typedef 不是必需的,但如果您不喜欢查看太多错误类型的括号,它们可能会有所帮助。

于 2012-07-13T11:26:45.817 回答