2011-12-31 2 views
0

MyContactListener 클래스 : .HContact Listener를 사용하려고합니다. "contact.End()"가 작동하지 않습니다. (Box2D의, 아이폰)

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

    } 

하지만 오류가 있습니다. 접촉를 시작하는 경우 충돌을 확인하려면

(주석으로 코드에 표시) I가 작동이 코드 :

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

    } 

주의가 문 "에 대해"나는 .begin를 교환() .end(). 그것이 차이점입니다.

하지만 왜 작동하지 않습니까? "콘택트가 끝나면"조명기를 점검하는 데 뭔가 잘못 됐습니까?

내가 이것을하고 싶은 이유는 조명기가 아무것도/아무것도 건드리지 않으면 지금하고 싶다.

답변

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

나는 당신이 그것을 대체해야한다고 생각 :

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

하지만 그건 내가 원하는 게 아니에요. 무언가와의 접촉이있는 경우 호출됩니다. 그러나 나는 시체를 구별하고 싶다. 그러나 나는 여전히 해결책을 찾았다. (box2d, 방금 연락처 청취자를 복사했습니다.) – cocos2dbeginner