我的Box2D示例应用程序中有大约10个实体,我是借助以下方法创建的。但是在我的Update方法中,我希望获得body的b2FixtureDef,因为我需要filter.groupIndex,这对于每个body都是不同的。我有如下的Update方法,它通过所有的b2Body循环,但是真的找不到如何从b2Body获取b2FixtureDef?
-(void) addNewSprite:(NSString *)spriteName AtPosition:(CGPoint)p isDynamic:(BOOL)dynamic
{
//CCNode *parent = [self getChildByTag:kTagParentNode];
PhysicsSprite *sprite = [PhysicsSprite spriteWithFile:spriteName];
[self addChild:sprite];
sprite.position = ccp( p.x, p.y);
sprite.tag = check;
// Define the dynamic body.
//Set up a 1m squared box in the physics world
b2BodyDef bodyDef;
bodyDef.type = b2_dynamicBody;
bodyDef.position.Set(sprite.position.x/PTM_RATIO, sprite.position.y/PTM_RATIO);
bodyDef.userData = sprite;
b2Body *body = world->CreateBody(&bodyDef);
// Define another box shape for our dynamic body.
b2PolygonShape dynamicBox;
dynamicBox.SetAsBox((sprite.contentSize.width/PTM_RATIO/2)*(sprite.scaleX),
(sprite.contentSize.height/PTM_RATIO/2)*(sprite.scaleY));//These are mid points for our 1m box
// Define the dynamic body fixture.
b2FixtureDef fixtureDef;
fixtureDef.shape = &dynamicBox;
fixtureDef.density = 1.0f;
fixtureDef.friction = 1.0f;
fixtureDef.userData = sprite;
switch (check)
{
case 1:
fixtureDef.filter.categoryBits = 0x0002;
fixtureDef.filter.maskBits = 0x0004;
break;
case 2:
fixtureDef.filter.categoryBits = 0x0004;
fixtureDef.filter.maskBits = 0x0002;
break;
}
body->CreateFixture(&fixtureDef);
[sprite setPhysicsBody:body];
check++;
}
-(void) update: (ccTime) dt
{
//It is recommended that a fixed time step is used with Box2D for stability
//of the simulation, however, we are using a variable time step here.
//You need to make an informed choice, the following URL is useful
//http://gafferongames.com/game-physics/fix-your-timestep/
int32 velocityIterations = 8;
int32 positionIterations = 1;
// Instruct the world to perform a single step of simulation. It is
// generally best to keep the time step and iterations fixed.
world->Step(dt, velocityIterations, positionIterations);
for(b2Body *b = world->GetBodyList(); b; b=b->GetNext()) {
if (b->GetUserData() != NULL)
{
//b2Fixture fixtureDef = *b->GetFixtureList();
//b2Filter filter = fixtureDef.GetFilterData();
// how to get b2FixtureDef from b
}
}
答案 0 :(得分:3)
实际上,我无法想象您为什么需要在更新方法中获取此信息。你不能得到fixtureDef,因为它仅用于夹具创建。但是您可以使用GetFilterData()方法获取每个主体夹具的过滤器数据。它将包含类别位,掩码位和组索引。