Cocos2d冲突有效,但b2contactListener无法检测到

时间:2013-10-01 08:00:21

标签: xcode cocos2d-iphone box2d collision-detection box2d-iphone

我遇到了关于b2contactListener的问题。

我有这两个类:

class Terrain
class Hero

每个类都有一个名为的方法: getHeroBody - >返回英雄的b2bodygetTerrainBody - >返回地形的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) {
}

1 个答案:

答案 0 :(得分:0)

<强>解决

_world-&gt; Step()必须在更新函数中的conctact侦听器之前。 抱歉这个愚蠢的问题。