Код установки верен.Я бы предложил некоторые изменения в классе 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?