1

画面に触れたときに新しいスプライト/ボディを作成しています:

-(void) addNewSpriteAtPosition:(CGPoint)pos
{
    b2BodyDef bodyDef;
    bodyDef.type = b2_dynamicBody;
    bodyDef.position=[Helper toMeters:pos];
    b2Body* body = world->CreateBody(&bodyDef);

    b2CircleShape circle;
    circle.m_radius = 30/PTM_RATIO;

    // Define the dynamic body fixture.
    b2FixtureDef fixtureDef;
    fixtureDef.shape=&circle;
    fixtureDef.density=0.7f;
    fixtureDef.friction=0.3f;
    fixtureDef.restitution = 0.5;
    body-> CreateFixture(&fixtureDef);

    PhysicsSprite* sprite = [PhysicsSprite spriteWithFile:@"circle.png"];
    [self addChild:sprite];
    [sprite setPhysicsBody:body];
    body->SetUserData((__bridge void*)sprite);
}

これが私のポジショニングヘルパーです:

+(b2Vec2) toMeters:(CGPoint)point
{
    return b2Vec2(point.x / PTM_RATIO, point.y / PTM_RATIO);
}

PhysicsSpriteはBox2Dで使用される典型的なものですが、関連するメソッドを含めます。

-(CGAffineTransform) nodeToParentTransform
{
    b2Vec2 pos = physicsBody->GetPosition();

    float x = pos.x * PTM_RATIO;
    float y = pos.y * PTM_RATIO;

    if (ignoreAnchorPointForPosition_)
    {
        x += anchorPointInPoints_.x;
        y += anchorPointInPoints_.y;
    }

    float radians = physicsBody->GetAngle();
    float c = cosf(radians);
    float s = sinf(radians);

    if (!CGPointEqualToPoint(anchorPointInPoints_, CGPointZero))
    {
        x += c * -anchorPointInPoints_.x + -s * -anchorPointInPoints_.y;
        y += s * -anchorPointInPoints_.x + c * -anchorPointInPoints_.y;
    }

    self.position = CGPointMake(x, y);

    // Rot, Translate Matrix
    transform_ = CGAffineTransformMake(c, s, -s, c, x, y);
    return transform_;
}

次に、スプ​​ライトを使用したデバッグ描画を示す次の2つの画像で示されている2つの問題があります。網膜および非網膜バージョン:

網膜

非網膜

問題#1-両方の画像でわかるように、オブジェクトが(0,0)から離れるほど、スプライトは物理体からさらにオフセットされます。

問題#2-赤い円の画像ファイルは60x60(網膜)で、白い円は30x30(非網膜)です。画面上でサイズが異なるのはなぜですか?Cocos2dはピクセルではなくポイントを使用する必要があるので、画面上で同じサイズにするべきではありませんか?

4

1 に答える 1

2

ハードコーディングされたサイズの代わりに、contentSize を使用してください。

circle.m_radius = sprite.contentSize.width*0.5f/PTM_RATIO;

これは、すべての SD および Retina モードで機能します。

このスタイルを使用して、box2d と cocos2d の位置を同期できます。

body->SetTransform([self toB2Meters:sprite.position], 0.0f);    //box2d<---cocos2d

//OR
sprite.position = ccp(body->GetPosition().x * PTM_RATIO,
                     body->GetPosition().y * PTM_RATIO);  //box2d--->cocos2d
于 2013-03-04T18:25:38.573 に答える