2011-08-16 3 views
2

im은 box2d for iOS와 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