2 votes

Filtrage des contacts de Box2d

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 !

1voto

Lukman Points 10217

J'ai lu votre question plusieurs fois, mais je ne comprends toujours pas si vous voulez qu'ils entrent en collision ou non. Donc, ici, je vais simplement afficher la façon de définir la fonction categoryBits y maskBits selon que vous voulez qu'ils entrent en collision ou non :

uint16 boopopCategoryBits = 1 << 0;
uint16 bubbleCategoryBits = 1 << 1;

uint16 boopopMaskBits = 0;
uint16 bubbleMaskBits = 0;

bool boobop_n_boobop_should_collide = true;
bool bubble_n_bubble_should_collide = true;
bool boobop_n_bubble_should_collide = true;

if (boobop_n_boobop_should_collide) {
    boopopMaskBits = boopopMaskBits | boopopCategoryBits;
}

if (bubble_n_bubble_should_collide) {
    bubbleMaskBits = bubbleMaskBits | bubbleCategoryBits;
}

if (boobop_n_bubble_should_collide) {
    bubbleMaskBits = bubbleMaskBits | boopopCategoryBits;
    boopopMaskBits = boopopMaskBits | bubbleCategoryBits;
}

Résultats

(boobop_n_boopop : bubble_n_bubble : boobop_n_bubble = boopopMaskBits : bubbleMaskBits)

true  : true  : true  = 3 : 3

true  : true  : false = 1 : 2

true  : false : false = 1 : 0

false : false : false = 0 : 0

false : true  : false = 0 : 2

false : true  : true  = 2 : 3

false : false : true  = 2 : 1

true  : false : true  = 3 : 1

J'espère que cela vous aidera.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X