11
votes

Is it possible to change the shape of a Box2d b2Body dynamically? I want to do this to achieve the following.

i). Increasing the radius of a circle shape at a certain rate

ii). Changing the dimensions of a bounding box for a sprite to match the changing animation frames.

1
You can't change the shape of box2d b2body dynamically, but you can achieve that by destroying and recreating the b2body.Renaissance
you only need to recreate the fixture, not the whole bodyLearnCocos2D
Yes my mistak, i was about to say but wrote b2body. You just have to recreate fixture only.Renaissance
@LearnCocos2D: +1 for an example on this.oopology

1 Answers

5
votes
   float radius;
   radius = 1;

Create body:

b2BodyDef bodyDef;
bodyDef.type = b2_dynamicBody;
bodyDef.position.Set(300/PTM_RATIO, 150/PTM_RATIO);
body = world->CreateBody(&bodyDef);

b2CircleShape circleShape;
circleShape.m_radius = radius;

b2FixtureDef fixtureDef;
fixtureDef.shape = &circleShape;
fixtureDef.density = 1;
fixtureDef.friction = 0.3f;
body ->CreateFixture(&fixtureDef);

In your touch method:

  - (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
   {  

    if (body != NULL) {

    b2Fixture *fixtureA = body->GetFixtureList();
    body->DestroyFixture(fixtureA);

    b2CircleShape circleShape;
    circleShape.m_radius = radius + 0.3; 

    b2FixtureDef fixtureDef;
    fixtureDef.shape = &circleShape;
    fixtureDef.density = 1;
    fixtureDef.friction = 0.3f;
    body->CreateFixture(&fixtureDef);

    radius = radius + 0.3;

   }

With every touch body will become bigger for 0.3.