检测box2d cocos2d中的接触端

时间:2013-09-06 02:52:28

标签: iphone cocos2d-iphone box2d contact

我一直在使用ray wenderlich的联系人监听器,它一直很好用于检测联系人但我不明白如何修改它以告诉我联系何时结束。

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

任何人都可以解释如何修改此侦听器或将我指向与检测联系人结尾不同的侦听器吗?

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

为了检测联系人我使用以下内容..

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
 }

2 个答案:

答案 0 :(得分:2)

您正在存储以_contacts开头的联系人。相反,你可以有两个向量std::vector<MyContact>。首先是已开始的联系人(_begin),第二个是已结束的联系人(_end)。当您的侦听器收到联系已结束的消息时 - 将其从_begin中删除 插入_end。在这种情况下,您将能够迭代两种类型的联系人。完成后,不要忘记clear _end个联系人。

同样用于检测是否更好地使用光线投射。您可以谷歌在box2d

中使用光线投射

答案 1 :(得分:0)

当_contactListner-&gt; _contact.size()的大小在那时为零时,没有联系。因此,当世界上存在联系时,_contact向量中会有一些值,当变为零时,这表明没有更多的联系:这就是联系的结束。