Семантическая проблема в приемнике контактов box2d

Я работаю над проектом cocos2d в XCode и пытаюсь заставить обнаружение столкновений работать в течение нескольких недель. Я использую учебники Рэя Вендерлиха, в которых говорится, что для обнаружения столкновений используется контактный слушатель. Однако я получаю ошибку Неверные операнды в бинарном выражении («const MyContact» и «const MyContact»). Я никогда не видел эту ошибку, кто-нибудь может помочь с этим?

#import "MyContactListener.h"
MyContactListener::MyContactListener() : _contacts() {
}

MyContactListener::~MyContactListener() {
}

void MyContactListener::BeginContact(b2Contact* contact) {
MyContact myContact = { contact->GetFixtureA(), contact->GetFixtureB() };
_contacts.insert(myContact);  <------------//Says "7.In instantiation of member function 'std::set<MyContact, std::less<MyContact>, std::allocator<MyContact> >::insert' requested  here"}

void MyContactListener::EndContact(b2Contact* contact) {
MyContact myContact = { contact->GetFixtureA(), contact->GetFixtureB() };
std::set<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 MyContctListener::PostSolve(b2Contact* contact, const b2ContactImpulse* impulse) {
}

0

Решение

Вы должны реализовать сравнение opeartor в MyContact класс для того, чтобы вставить его в std::set, Что-то вроде:

class MyContact
{
...
bool operator<(const MyContact &other) const
{
if (fixtureA == other.fixtureA) //just pointer comparison
return fixtureB < other.fixtureB;
return fixtureA < other.fixtureA;
}
};

Требуется оператор сравнения std::set для того, чтобы поддерживать его внутреннее дерево двоичного поиска.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]