2011-08-16 4 views
2

im en utilisant box2d dans iOS et la bibliothèque cocos2d. Je suis actuellement en train d'essayer d'utiliser le filtrage de contacts, mais j'ai trouvé que la méthode de masquage de bits de catégorie ne fonctionnait tout simplement pas pour moi. J'ai compris la méthode, mais pour une raison étrange, cela ne fonctionne pas. Im initialisant mes objets filtrent les données après avoir créé l'objet, c'est parce que j'utilise une bibliothèque externe et n'ai pas un accès direct à l'appareil à la création. (Il réside dans un fichier .plist).Filtrage des contacts Box2d

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); 
} 

im Fondamentalement mettre à 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é deux techniques, le groupIndex et categoryBits, les deux ne fonctionnent pas. Mettre tous les indices de groupe à -1 ne fait pas que tous mes objets BubbleNode et Boopop filtrent la collision. De même, en définissant leur maskBits à 0x0000 ne le fait pas pour filtrer leurs collisions non plus. Je pense que c'était peut-être quelque chose à voir avec ma méthode, mais mettre toutes les valeurs de groupIndex à -1 devrait les faire toutes se filtrer les unes les autres.
Alors maintenant, je suis en train de questionner mon code plus que les bits.

Aidez qui que ce soit!
Merci!

Répondre

1

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 poster la façon de régler la categoryBits et 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 

Hope this helps.

+0

Salut, Oui, je comprends le masquage de bits, mais quelque chose ne fonctionnait pas dans mon code. J'ai regardé votre autre article à propos des appareils multiples sur un corps qui les amèneraient à rester ensemble s'ils apparaissaient. J'ai corrigé ceci et ai enlevé l'initialisation du dossier de plist, et le masquage fonctionne maintenant. Merci! – Ospho