Iphone 检测box2d cocos2d中的触点端

Iphone 检测box2d cocos2d中的触点端,iphone,cocos2d-iphone,box2d,contact,Iphone,Cocos2d Iphone,Box2d,Contact,我一直在使用ray wenderlich的contact listener,它在检测联系人方面工作得很好,但我不知道如何修改它,以便在联系人结束时告诉我 我想给我的敌人添加一个传感器,这样他们就可以检测到地板何时结束,并转身而不是摔倒 有人能解释一下如何修改这个侦听器,或者给我指出一个不同于detect contact ends的侦听器吗 //MyContactListener.mm MyContactListener::MyContactListener() : _contacts() { }

我一直在使用ray wenderlich的contact listener,它在检测联系人方面工作得很好,但我不知道如何修改它,以便在联系人结束时告诉我

我想给我的敌人添加一个传感器,这样他们就可以检测到地板何时结束,并转身而不是摔倒

有人能解释一下如何修改这个侦听器,或者给我指出一个不同于detect contact ends的侦听器吗

//MyContactListener.mm

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->_contact.size()的大小为零时,此时没有联系人。所以,当世界上有联系人时,_contactvector中会有一些值,当它变为零时,这表明再也没有联系人了:这就是联系人的结束。

您存储的联系人是从
_contacts
开始的。相反,您可以有两个向量
std::vector
。第一个用于开始的联系人(
\u begin
),第二个用于结束的联系人(
\u end
)。当您的侦听器收到联系人已结束的消息时,将其从
\u begin
中删除,然后 插入到
\u端
。在这种情况下,您将能够迭代两种类型的联系人。只是不要忘记在处理完联系人后清除他们


也用于检测地板是否结束,最好使用光线投射。您可以在谷歌上搜索使用ray cast in
box2d

,因此,对于大小的每一次减小,都意味着某些联系人已结束。您如何使用它?您需要联系人拥有的信息谢谢!我仍然有一些关于光线投射的阅读,但是看起来光线投射可以解决一些我没有解决方案的其他问题!
for(pos = _contactListener->_contacts.begin();

    pos != _contactListener->_contacts.end(); ++pos) {

    MyContact contact = *pos;
    b2Body *bodyA = contact.fixtureA->GetBody();
    b2Body *bodyB = contact.fixtureB->GetBody();
        CCSprite *spriteA = (CCSprite *) bodyA->GetUserData();
        CCSprite *spriteB = (CCSprite *) bodyB->GetUserData();

//...do stuff
 }