Я не знаком с Box2d, но из того, что вы описали в своей проблеме, это должно вам помочь:
В вашем .h:
@interface foo : FooBar {
BOOL hasDetectedCollision;
}
и в вашем.m:
- (void)viewDidLoad {
hasDetectedCollision = NO;
}
, затем просто замените
if ((spriteA.tag == 1 && spriteB.tag == 2) || (spriteA.tag == 2 && spriteB.tag == 1)) {
NSLog(@"tag 1 hit tag 2");
}
на
if ((hasDetectedCollision == NO) && ( (spriteA.tag == 1 && spriteB.tag == 2) || (spriteA.tag == 2 && spriteB.tag == 1) ) ) {
hasDetectedCollision = YES;
NSLog(@"tag 1 hit tag 2");
[self doSomethingWhenCollisionHappens];
}
, а затем:
- (void)doSomethingWhenCollisionHappens {
//here you might want to remove an object because of a collision
//or maybe change the color of the objects that collided
//I can't provide more details of what you might want
//to do without seeing more of your code
//but when you are ready to start receiving collision updates again
//set hasDetectedCollision to NO again
hasDetectedCollision = NO;
}
Затем, когда вывыполнив все, что вы хотите сделать, когда обнаружите столкновение, установите для hasDetectedCollision значение no, и вы можете начать заново.
Edit:
std::vector<b2Body *>toDestroy;
std::vector<MyContact>::iterator pos;
for(pos = _contactListener->_contacts.begin(); pos != _contactListener->_contacts.end(); ++pos) {
MyContact contact = *pos;
// Get the box2d bodies for each object
b2Body *bodyA = contact.fixtureA->GetBody();
b2Body *bodyB = contact.fixtureB->GetBody();
if (bodyA->GetUserData() != NULL && bodyB->GetUserData() != NULL) {
CCSprite *spriteA = (CCSprite *) bodyA->GetUserData();
CCSprite *spriteB = (CCSprite *) bodyB->GetUserData();
if(hasDetectedCollision == NO)
NSLog(@"hasDetectedCollision == NO");
if ((spriteA.tag == 1 && spriteB.tag == 2) || (spriteA.tag == 2 && spriteB.tag == 1)) {
NSLog(@"tag 1 hit tag 2");
}
Если оператор if проверяет состояниеhasDetectedCollision выполняется, тогда проблема не в булевом, а в вашем обнаружении столкновений.