Связаться со слушателем в Box2d Cocos2d - PullRequest
0 голосов
/ 04 сентября 2011

Я хочу вращать спрайт и двигаться вперед после столкновения с объектом. Столкновение должно использовать Box2d, так как мне нужно столкновение с идеальным пикселем. у меня есть заголовок и класс реализации для contactlistener, но как мне реализовать его в основном классе?

Мой .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);

};

Это мой .M файл для прослушивателя контактов

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

В основном классе у меня

contactListner = new MyContactListener;
world->SetContactListener(contactListner);

После этого как проверить наличие столкновений в методе планировщика?

Спасибо за помощь

1 Ответ

0 голосов
/ 04 октября 2011

в вашем методе планировщика, переберите контакты, проверьте, в порядке ли коллизия:

for(pos = _contactListener->_contacts.begin(); 
        pos != _contactListener->_contacts.end(); ++pos) {
            MyContact contact = *pos;
     if(contact->fixtureA == ball && contact->fixtureB == wall){
        //Do something
     }
}
...