0

我一直在使用 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
 }
4

2 回答 2

2

您正在存储开始于 的联系人_contacts。相反,您可以有两个向量std::vector<MyContact>。第一个用于开始接触 ( _begin),第二个用于结束接触 ( _end)。当您的听众收到联系已结束的消息时 - 将其删除_begin并插入_end. 在这种情况下,您将能够遍历这两种类型的联系人。完成后不要忘记clear _end联系他们。

还用于检测地板是否结束最好使用光线投射。你可以谷歌使用光线投射box2d

于 2013-09-06T05:52:34.103 回答
0

当 _contactListner->_contact.size() 的大小在那时为零时,没有联系。所以当世界上有接触时, _contact 向量中会有一些值,当它变为零时,这表明进一步没有接触:那就是接触的结束。

于 2013-09-06T04:58:22.280 回答