如何使用Box2D在cocos2d iPhone上调整b2CircleShape的大小

How do I resize a b2CircleShape on cocos2d iPhone with Box2D

本文关键字:b2CircleShape 调整 iPhone 何使用 Box2D cocos2d      更新时间:2023-10-16

我有一个2D物理沙盒,上面有一堆圆圈,它们在接触时会调整大小(越大越大,越小)。我可以很好地调整精灵的大小,我知道你不能缩放 B2Body - 你需要销毁它并重新创建它,但我对 Box2D 还不够熟悉。

以下是我正在调整精灵大小的方法:

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;
        }
    }        
} 

如何调整(销毁/重新创建)Box2D 主体(b2CircleShape?)。

我认为这就是你在 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;
嗨,

你这个英俊的魔鬼。

方法如下:

    //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();