0

b2contactListener に問題があります。

私はこれらの2つのクラスを持っています:

class Terrain
class Hero

各クラスには次のメソッドがあります: getHeroBody->b2bodyヒーローの を返します。 getTerrainBody-> b2bodyTerrain の を返します。

各クラスに(id)initWithWorld:(b2World *)world;は、b2World

これらのクラスで 2 つのオブジェクトを作成するときは、同じものを使用しb2Worldます。

問題は次のとおりです。衝突は機能しますが、これらの衝突を検出するすべてのメソッドは常に null 配列 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;
            }
        }
    }
}

// 機能しない 2 番目の方法

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() は、更新関数の conctact リスナーの前にある必要があります。愚かな質問で申し訳ありません。

于 2013-10-02T08:54:51.000 に答える