使用Box2D在Cocos2D中缩放精灵的正确方法是什么?

时间:2012-10-22 11:41:41

标签: objective-c cocos2d-iphone box2d box2d-iphone

我正在使用PhysicsSprite类

我已经更改了这段代码:

transform_ = CGAffineTransformMake( c,  s,
                                   -s,  c,
                                   x,   y );

nodeToParentTransform方法中:

transform_ = CGAffineTransformMake( c * scaleX_,  s * scaleX_,
                                   -s * scaleY_,  c * scaleY_,
                                   x,   y );

问题在于物理体是错位的,正如您在此屏幕截图中看到的那样(在调试绘图中启用了e_shapeBit):

square zombies

创建机构如下:

    b2BodyDef bodyDef;
    bodyDef.type = b2_dynamicBody;
    bodyDef.position.Set(brick.sprite.position.x/PTM_RATIO, brick.sprite.position.y/PTM_RATIO);
    bodyDef.userData = brick.sprite;
    b2Body *body = world->CreateBody(&bodyDef);
    body->SetGravityScale(0);
    brick.sprite.userData = body;

    b2PolygonShape dynamicBox;
    dynamicBox.SetAsBox(levelObj.brickScale * .5f, levelObj.brickScale * .5f);

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

    body->SetType(b2_dynamicBody);
    brick.sprite.userObject = brick;
    [brick.sprite setPhysicsBody:body];

修改 抱歉,我还没有说清楚:通过缩放我的意思是自然的Cocos2D构造brick.sprite.scale = 0.5f,其中brick.spritePhysicsSprite类的实例。如果不修改nodeToParentTransform,它就完全没有效果。砖精灵是32x32px,PTM_RATIO = 32它提供1x1m的物理尺寸,因此是SetBox参数。

2 个答案:

答案 0 :(得分:0)

您不必修改 nodeToParentTransform 方法以支持缩放。您可以初始化您的身体形状以匹配精灵的尺寸:

dynamicBox.SetAsBox(brick.sprite.contentSize.width/PTM_RATIO * brick.sprite.scaleX * .5f, brick.sprite.contentSize.height/PTM_RATIO * brick.sprite.scaleY * .5f);

答案 1 :(得分:0)

最好的方法是在精灵身高和体重的帮助下创造身体。