2012-04-13 14 views
0

2次元の物理サンドボックスには、接触時にサイズ変更する円の束があります(大きなものは大きくなり、小さいものは小さくなります)。スプライトのサイズを変更することができますし、B2Bodyをスケールすることはできないことを理解しています。それを破棄して再作成する必要がありますが、まだBox2Dには慣れていません。ここでBox2Dを使ってb2CircleShapeのサイズを変更するには

は、私はスプライトのサイズを変更するためにやっているものです:

std::vector<MyContact>::iterator pos; 
for(pos = _contactListener->_contacts.begin(); 
    pos != _contactListener->_contacts.end(); ++pos) { 
    MyContact contact = *pos; 

    b2Body *bodyA = contact.fixtureA->GetBody(); 
    b2Body *bodyB = contact.fixtureB->GetBody(); 
    if (bodyA->GetUserData() != NULL && bodyB->GetUserData() != NULL) { 
     PaintBlob *spriteA = (PaintBlob *) bodyA->GetUserData(); 
     PaintBlob *spriteB = (PaintBlob *) bodyB->GetUserData(); 

     NSLog(@"spriteA: %@ is touching spriteB: %@", spriteA, spriteB); 


     if((spriteA.scale > spriteB.scale) && (spriteB.scale > 0)){ 
      spriteA.scale = spriteA.scale + kSCALE_INCREMENT; 
      spriteB.scale = spriteB.scale - kSCALE_INCREMENT; 
     }else if (spriteA.scale >0) { 
      spriteB.scale = spriteB.scale + kSCALE_INCREMENT; 
      spriteA.scale = spriteA.scale - kSCALE_INCREMENT; 
     } 

    }   
} 

は、どのように私は(b2CircleShape?)(再作成/破棄)BOX2D本体のサイズを変更します。

私は、これはあなたがCでそれを行う方法だと思う - emanueleferonato.comから(私はCを理解するのに十分な悟りを開いていないです):

// if I selected a body... 
if (body) { 
       // I know it's a circle, so I am creating a b2CircleShape variable 
       var circle:b2CircleShape=body.GetShapeList() as b2CircleShape; 
       // getting the radius.. 
       var r=circle.GetRadius(); 
       // removing the circle shape from the body 
       body.DestroyShape(circle); 
       // creating a new circle shape 
       var circleDef:b2CircleDef; 
       circleDef = new b2CircleDef(); 
       // calculating new radius 
       circleDef.radius=r*0.9; 
       circleDef.density=1.0; 
       circleDef.friction=0.5; 
       circleDef.restitution=0.2; 
       // attach the shape to the body 
       body.CreateShape(circleDef); 
       // determine new body mass 
       body.SetMassFromShapes(); 
      } 
      return body; 

答えて

1

こんにちは、あなたはハンサムな悪魔。ここで

は、方法は次のとおりです。

//Radius is worked out by scale * kBLOBDIAMETER /2 
    contact.fixtureA->GetShape()->m_radius = (spriteA.scale * kBLOBLDIAMETER/2) /PTM_RATIO; 
    contact.fixtureB->GetShape()->m_radius = (spriteB.scale * kBLOBLDIAMETER/2) /PTM_RATIO; 
    bodyA->ResetMassData(); 
    bodyB->ResetMassData(); 
関連する問題