Попытка использовать контактный слушатель.Прослушивание "contact.End ()" не работает.(Box2d, iPhone) - PullRequest
0 голосов
/ 31 декабря 2011

Класс MyContactListener: .h

#import "Box2D.h"
#import <vector>
#import <algorithm>

struct MyContact {
    b2Fixture *fixtureA;
    b2Fixture *fixtureB;
    bool operator==(const MyContact& other) const
    {
        return (fixtureA == other.fixtureA) && (fixtureB == other.fixtureB);
    }
};

class MyContactListener : public b2ContactListener {

public:
    std::vector<MyContact>_contacts;

    MyContactListener();
    ~MyContactListener();

    virtual void BeginContact(b2Contact* contact);
    virtual void EndContact(b2Contact* contact);
    virtual void PreSolve(b2Contact* contact, const b2Manifold* oldManifold);    
    virtual void PostSolve(b2Contact* contact, const b2ContactImpulse* impulse);

};

.mm

#import "MyContactListener.h"

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) {
}

Теперь проблема: в моем методе обновления у меня есть этот код для проверки столкновения, если контакт * заканчивается *:

std::vector<MyContact>::iterator pos3;
    for(pos3 = contactListener->_contacts.end(); 
        pos3 != contactListener->_contacts.begin(); ++pos3) {
        MyContact contact = *pos3; // here I get "EXE_BAD_ACCESS"

        if (contact.fixtureA == detectorFixture || contact.fixtureB == detectorFixture) {
        }

    }

Но я получаю ошибку. (помечено в коде как комментарий)

Чтобы проверить столкновение, если начинается контакт У меня есть этот код, который работает:

std::vector<MyContact>::iterator pos;
    for(pos = contactListener->_contacts.begin(); 
        pos != contactListener->_contacts.end(); ++pos) {
        MyContact contact = *pos;

        if (contact.fixtureA == detectorFixture || contact.fixtureB == detectorFixture) {
        }

    }

Обратите внимание на оператор for, я поменял .begin () на .end (). В этом разница.

Но почему это не работает? Я сделал что-то не так для проверки прибора, если "контакт заканчивается".

Причина, по которой я хочу это сделать, заключается в том, что я хочу сейчас, если прибор не касается чего-либо / ничего.

1 Ответ

1 голос
/ 03 января 2012
for(pos3 = contactListener->_contacts.end(); 
        pos3 != contactListener->_contacts.begin(); ++pos3)

Я думаю, вы должны заменить его на:

for(pos3 = contactListener->_contacts.begin(); 
        pos3 != contactListener->_contacts.end(); ++pos3)
...