Реализация проблемы b2ContactListener (box2d) - PullRequest
1 голос
/ 31 октября 2011

Я читал руководство по box2d и увидел, что межкадровые контакты можно собирать только с помощью b2ContactListener.

Я создал класс ActorListener (все объекты активного мира являются актерами)

class ActorListener : public b2ContactListener
{ 
    public :
    ActorListener();
    ~ActorListener();

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

И добавил его в мой мир при инициализации игры:

    Listener = new ActorListener();
    world->SetContactListener(Listener);

Но как только происходит столкновение, я получаю сообщение об ошибке в b2Contact.cpp

    if (wasTouching == false && touching == true && listener)
{
    listener->BeginContact(this); //EXC_BAD_ACCESS
}

Есть идеи?Я делаю это неправильно?

1 Ответ

2 голосов
/ 31 октября 2011

Код установки верен.Я бы предложил некоторые изменения в классе ActorListener:

class ActorListener : public b2ContactListener
{ 
    private :
    void BeginContact(b2Contact* contact);
    void EndContact(b2Contact* contact);
    void PreSolve(b2Contact* contact, const b2Manifold* oldManifold);    
    void PostSolve(b2Contact* contact, const b2ContactImpulse* impulse);
};

Я не уверен, что эти исправления изменят вашу проблему.Изменение прослушивателя контактов путем добавления конструктора, деструктора и перехода к общедоступным виртуальным методам по-прежнему не вызывало сбой.Поэтому я предполагаю, что маловероятно, что интерфейс класса является проблемой.

Тем не менее, если вам не нужен конструктор или деструктор, вы можете их пропустить.Вам также следует удалить ключевое слово virtual, так как вы предоставляете конкретную реализацию и не планируете создавать подклассы ActorListener (верно?).Не виртуальные методы немного быстрее.Наконец, методы должны быть закрытыми, потому что только Box2D будет вызывать их, никакой другой код не должен вызывать методы в классе ActorListener.Если вы получите ошибки компиляции после внесения этих изменений, это может быть связано с падением.

Сбой указывает, что, по всей вероятности, listener больше не указывает на действительную память, то есть она была освобождена.Другая возможность может заключаться в том, что фактический код в BeginContact вызывает сбой, но по какой-то причине отладчик останавливается на линии, выполняющей вызов.Возможно, вы захотите установить точку останова в BeginContact.И добавьте реализацию BeginContact к своему вопросу.

Наконец, хотя я предполагаю, что компилятор проверит это, для расширения файла реализации ActorListener установлено значение .mm?

...