我遇到了关于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) {
}
答案 0 :(得分:0)
<强>解决强>
_world-&gt; Step()必须在更新函数中的conctact侦听器之前。 抱歉这个愚蠢的问题。