我正在编写一个游戏,该游戏记录了已击中的球数 - 这个想法是尽可能多地击球。我正在使用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]];
}
}
答案 0 :(得分:3)
您只是检查是否有任何碰撞。您需要检查哪些对象发生冲突并记录下来。
例如:
一般情况下,我会按照您的步骤逐步完成碰撞,但我会将精灵和/或身体记录在一个数组中。在检查碰撞时,请检查以确保您的阵列尚未存储该sprite / body。如果有,您已经完成了碰撞,如果没有,则存储碰撞。然后在检查完所有碰撞之后,我删除任何精灵和身体并添加我的点数。
联系人监听器将报告bodyA命中bodyB,AND bodyB命中bodyA的联系人。就联络听众而言,这是两个不同的碰撞。