0

我有一个关于 b2contactListener 的问题。

我有这两个类:

class Terrain
class Hero

每个类都有一个名为: getHeroBody-> 返回b2body英雄的方法。 getTerrainBody-> 返回b2body地形的。

每个类都有一个调用的方法,该方法(id)initWithWorld:(b2World *)world;需要一个b2World

当我在这些类上创建 2 个对象时,我使用相同的b2World.

现在的问题是:碰撞有效,但所有检测这些碰撞的方法总是返回一个空数组,0,也就是说没有碰撞。

这是声明

MyContactListener *_contactListener;

_contactListener = new MyContactListener();
_world->SetContactListener(_contactListener);

这是游戏永远不会进入的 2 个周期:

//第一种方法不工作

std::vector<MyContact>::iterator pos;
for(pos = _contactListener->_contacts.begin();pos != _contactListener->_contacts.end(); ++pos) { //never enters
    MyContact contact = *pos;
    for(b2Fixture *terrain_fixture = [_terrain getTerrainBody]->GetFixtureList(); terrain_fixture; terrain_fixture = terrain_fixture->GetNext()){
        for (b2Fixture *char_fixture = [_hero getHeroBody]->GetFixtureList(); char_fixture; char_fixture = char_fixture->GetNext()){
            if ((contact.fixtureA == terrain_fixture && contact.fixtureB == char_fixture) ||
                (contact.fixtureA == char_fixture && contact.fixtureB == terrain_fixture)) {
                isontheground = YES;
            }
        }
    }
}

//第二种方法不工作

for (b2Contact* contact = _world->GetContactList(); contact; contact = contact->GetNext()){ //never enters
    isontheground = YES;
}

第一种使用这个类

MyContactListener::MyContactListener() : _contacts() {

}

MyContactListener::~MyContactListener() { }

void MyContactListener::BeginContact(b2Contact* contact) {
    // We need to copy out the data because the b2Contact passed in
    // is reused.
    MyContact myContact = { contact->GetFixtureA(), contact->GetFixtureB() };
    _contacts.push_back(myContact);
}

void MyContactListener::EndContact(b2Contact* contact) {
    MyContact myContact = { contact->GetFixtureA(), contact->GetFixtureB() };
    std::vector<MyContact>::iterator pos;
    pos = std::find(_contacts.begin(), _contacts.end(), myContact);
    if (pos != _contacts.end()) {
        _contacts.erase(pos);
    }
}

void MyContactListener::PreSolve(b2Contact* contact,
                                 const b2Manifold* oldManifold) {
}

void MyContactListener::PostSolve(b2Contact* contact,
                                  const b2ContactImpulse* impulse) {
}
4

1 回答 1

0

解决了

_world->Step() 必须在更新函数中的联系人监听器之前。对不起这个愚蠢的问题。

于 2013-10-02T08:54:51.000 回答