1

PhysicsSprite クラスを使用しています

このコードを変更しました:

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

nodeToParentTransformメソッドで:

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

問題は、このスクリーンショット (デバッグ描画で e_shapeBit が有効になっている) でわかるように、物理的なボディが間違って配置されていることです。

四角いゾンビ

ボディは次のように作成されます。

    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.spriteのインスタンスです。PhysicsSprite変更nodeToParentTransformしないと、まったく効果がありません。ブリック スプライトは 32x32px で、PTM_RATIO = 32物理サイズは 1x1m であるため、SetBox パラメータです。

4

2 に答える 2

0

スケーリングをサポートするためにnodeToParentTransformメソッドを変更する必要はありません。代わりに、スプライトの寸法に合わせて体の形状を初期化できます。

dynamicBox.SetAsBox(brick.sprite.contentSize.width/PTM_RATIO * brick.sprite.scaleX * .5f, brick.sprite.contentSize.height/PTM_RATIO * brick.sprite.scaleY * .5f);
于 2012-10-22T14:57:38.777 に答える
0

最良の方法は、スプライトの高さと重さを利用してボディを作成することです。

于 2013-11-18T10:27:05.043 に答える