J'utilise box2d dans iOS et la bibliothèque cocos2d. J'essaie actuellement d'utiliser le filtrage des contacts, mais j'ai constaté que la méthode de masquage des bits de catégorie ne fonctionne tout simplement pas pour moi. J'ai compris la méthode, mais pour une raison étrange, cela ne fonctionne pas.
J'initialise les données de filtrage de mes objets après avoir créé l'objet, car j'utilise une bibliothèque externe et je n'ai pas d'accès direct au dispositif lors de la création. (Il réside dans un fichier .plist).
bodydef.type = b2_dynamicBody;
bodydef.position.Set(location.x/PTM_RATIO, location.y/PTM_RATIO);
bodydef.userData = self;
bodydef.fixedRotation = true;
//bodydef.angularDamping = 2.0f;
body = world->CreateBody(&bodydef);
// add the fixture definitions to the body
[[GB2ShapeCache sharedShapeCache] addShapesWithFile:@"bubblephysics.plist"];
[[GB2ShapeCache sharedShapeCache] addFixturesToBody:body forShapeName:filename];
[sprite setAnchorPoint:[[GB2ShapeCache sharedShapeCache] anchorPointForShape:filename]];
//Apply a new filter on the initialized body
b2Fixture *tempFixture = self.body->GetFixtureList();
b2Filter temp = tempFixture->GetFilterData();
if ([self isMemberOfClass:[Boopop class]]){
temp.categoryBits = 0x0004;
temp.maskBits = 0x0000;
temp.groupIndex = 0;
tempFixture->SetFilterData(temp);
}
if ([self isMemberOfClass:[BubbleNode class]]){
temp.categoryBits = 0x0004;
temp.maskBits = 0x0000;
temp.groupIndex = 0;
tempFixture->SetFilterData(temp);
}
En fait, je mets à jour mes filtres de contact à la volée, avec deux méthodes :
-(void)freezeBubble{
self.isFrozen = NO; //Stops Iteration of the b2Body and CCSprite;
b2Fixture *tempFixture = self.body->GetFixtureList();
b2Filter temp = tempFixture->GetFilterData();
temp.groupIndex = 0;
temp.categoryBits = 0x0004;
temp.maskBits = 0x0000;
tempFixture->SetFilterData(temp);
}
-(void)unfreezeBubble{
self.isFrozen = NO;
b2Fixture *tempFixture = self.body->GetFixtureList();
b2Filter temp = tempFixture->GetFilterData();
NSLog(@"Previous Bits: cat = %d, mask = %d",temp.categoryBits,temp.maskBits);
temp.groupIndex = 0;
temp.categoryBits = 0x0004;
temp.maskBits = 0x0000;
tempFixture->SetFilterData(temp);
}
J'ai essayé les deux techniques, le groupIndex et le categoryBits, les deux ne fonctionnent pas. En fixant tous les indices de groupe à -1, tous mes objets BubbleNode et Boopop ne filtrent pas la collision. De même, en fixant leurs maskBits à 0x0000, ils ne filtrent pas non plus leurs collisions.
Je suis assez perplexe, je pensais que c'était peut-être quelque chose à faire avec ma méthode, mais en mettant toutes les valeurs de groupIndex à -1, elles devraient toutes se filtrer les unes les autres.
Donc maintenant, je remets en question mon code plus que les bits.
Aidez-nous !
Merci !