2011-08-16 9 views
2

imはiOSのbox2dとcocos2d-libraryを使用しています。 私は現在、連絡先のフィルタリングを使用しようとしていますが、カテゴリビットマスキング方法が単に私のために働いていないことがわかりました。私は方法を理解しましたが、いくつかの奇妙な理由でそれが機能していません。Box2d連絡先のフィルタリング

私はオブジェクトを作成した後、私のオブジェクトのフィルタデータを初期化していますが、これは外部ライブラリを使用していて、作成時にフィクスチャに直接アクセスできないためです。 (.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); 
} 

は、基本的には二つの方法で、その場で私の連絡先フィルタを更新イム:

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

私は両方の技術、のGroupIndexとcategoryBits、両方はいけない仕事をしようとしました。すべてのグループの指標を-1に設定すると、私のBubbleNodeとBoopopオブジェクトはすべて衝突をフィルタリングしません。同様に、maskBitsを0x0000に設定しても、それらの衝突をフィルタリングすることはできません。

私はおそらくそれが自分の方法と関係していると思っていましたが、すべてのgroupIndex値を-1に設定すると、すべてが互いにフィルタリングされるはずです。
さて、私はビットよりも私のコードに質問しています。

助けてください!
ありがとうございます!

答えて

1

私はあなたの質問を何度も読んだが、あなたがそれらを衝突させるかどうかにかかわらず、まだそれを得ていない。だからここに私はあなたがそれらが衝突するかしないかに基づいてcategoryBitsmaskBitsを設定する方法を投稿します:

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

結果

(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 

・ホープ、このことができます。

+0

こんにちは、私はビットマスキングを理解していますが、何かが私のコードで働いていませんでした。私は1体の複数の器具についてあなたの他のポストを見て、それらが生まれたら一緒に固執するでしょう。私はこれを修正し、plistファイルから初期化を取り除き、今マスキングが機能します。 ありがとう! – Ospho

関連する問題