Box2d - 仅检测单个碰撞

时间:2011-07-19 12:09:00

标签: iphone objective-c cocos2d-iphone collision-detection box2d

我正在编写一个游戏,该游戏记录了已击中的球数 - 这个想法是尽可能多地击球。我正在使用Cocos2d和Box2d进行物理和碰撞检测。

得分有效但有时球会最终沿着彼此移动,当发生这种情况时会记录多次碰撞。理想情况下,我希望每次真实碰撞只记录一次碰撞(即得分++)。

实现这一目标的最佳方法是什么,因为如果两个球击中不止一次,我希望得分增加,但只有当它们实际碰撞而不是相互刮擦时才会得分。

我目前在我的勾选功能中使用以下代码

//detect collisions
std::vector<MyContact>::iterator pos;
for(pos = _contactListener->_contacts.begin(); 
    pos != _contactListener->_contacts.end(); ++pos) {
    MyContact contact = *pos;

    b2Body *bodyA = contact.fixtureA->GetBody();
    b2Body *bodyB = contact.fixtureB->GetBody();
    if (bodyA->GetUserData() != NULL && bodyB->GetUserData() != NULL) {
        NSLog(@"Collision!");

        score++;
        [scoreLabel setString:[NSString stringWithFormat:@"Score: %d", score]];
    }    
}

1 个答案:

答案 0 :(得分:3)

您只是检查是否有任何碰撞。您需要检查哪些对象发生冲突并记录下来。

例如:

一般情况下,我会按照您的步骤逐步完成碰撞,但我会将精灵和/或身体记录在一个数组中。在检查碰撞时,请检查以确保您的阵列尚未存储该sprite / body。如果有,您已经完成了碰撞,如果没有,则存储碰撞。然后在检查完所有碰撞之后,我删除任何精灵和身体并添加我的点数。

联系人监听器将报告bodyA命中bodyB,AND bodyB命中bodyA的联系人。就联络听众而言,这是两个不同的碰撞。