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!
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