2011-08-16 72 views
2

即時通訊在iOS和cocos2d庫中使用box2d。 我目前正在嘗試使用聯繫人過濾,但發現類別位掩碼方法根本不適用於我。我已經理解了這個方法,但是由於一些奇怪的原因,它不能工作。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

嗨,是的,我瞭解位掩碼,但有些東西不能在我的代碼中工作。我看着你的另一個帖子,關於一個身體上的多個裝置,如果它們產生了,它們會粘在一起。我解決了這個問題,並從plist文件中刪除了初始化,並且現在可以使用蒙版。 謝謝! – Ospho