Xcode Cocos2d冲突可以工作,但不能被b2contactListener检测到

Xcode Cocos2d冲突可以工作,但不能被b2contactListener检测到,xcode,cocos2d-iphone,box2d,collision-detection,box2d-iphone,Xcode,Cocos2d Iphone,Box2d,Collision Detection,Box2d Iphone,我有一个关于你的问题 我有两门课: class Terrain class Hero 每个类都有一个名为: getHeroBody->返回英雄的b2body。 getTerrainBody->返回地形的b2body 每个类都有一个名为(id)initWithWorld:(b2World*)world的方法需要一个b2World 当我在这些类上创建两个对象时,我使用相同的b2World 现在的问题是: 冲突可以工作,但是所有检测这些冲突的方法都会返回一个空数组0,换句话说,没有冲突 这是申报单

我有一个关于你的问题

我有两门课:

class Terrain
class Hero
每个类都有一个名为:
getHeroBody
->返回英雄的
b2body
getTerrainBody
->返回地形的
b2body

每个类都有一个名为
(id)initWithWorld:(b2World*)world的方法需要一个
b2World

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

现在的问题是: 冲突可以工作,但是所有检测这些冲突的方法都会返回一个空数组0,换句话说,没有冲突

这是申报单

MyContactListener *_contactListener;

_contactListener = new MyContactListener();
_world->SetContactListener(_contactListener);
以下是两个游戏从未进入的循环:

//第一种方法不起作用

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){
//我们需要复制数据,因为B2B联系人传入了
//重复使用。
MyContact MyContact={contact->GetFixtureA(),contact->GetFixtureB()};
_触点。推回(myContact);
}
void MyContactListener::EndContact(b2Contact*contact){
MyContact MyContact={contact->GetFixtureA(),contact->GetFixtureB()};
std::vector::iterator pos;
pos=std::find(_contacts.begin(),_contacts.end(),myContact);
如果(位置=_contacts.end()){
_触点。擦除(pos);
}
}
void MyContactListener::预解决(b2Contact*contact,
常数b2Manifold*oldManifold){
}
void MyContactListener::PostSolve(b2Contact*联系人,
常数(脉冲*脉冲){
}

已解决

_world->Step()必须位于更新函数中的ConContact侦听器之前。
很抱歉问了这个愚蠢的问题。

你说的碰撞工作是什么意思?你能发布相关的冲突和初始化代码吗?简单地说,我从来没有在这个std::vector::iterator pos中输入过;对于(pos=_contactListener->_contacts.begin();pos!=_contactListener->_contacts.end();++pos),联系人侦听器中的联系人是什么?如何填充它?_contact在Ray Wenderlich复制的教程中的mycollision类中声明。第二个“for”是在网络上找到的一个片段,顺便说一句,它从来没有进入这两个循环。我用类where_contat编辑了这篇文章。
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) {
}