2013-03-04 116 views
1

触摸屏幕,当我创造新的精灵/机构的iOS问题:Box2D的和Cocos2d与精灵和定位

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

现在,我已经由followi说明两个问题这两个图像显示了与精灵的调试绘制。视网膜和非视网膜版本:

retina

non-retina

问题#1 - 你可以在两个图像看到,进一步远离(0,0)的对象,精灵变得更偏离物理体。

问题#2 - 红圈图像文件为60x60(视网膜),白圈为30x30(非视网膜)。为什么它们在屏幕上的大小不同? Cocos2d应该使用点,而不是像素,所以它们不应该是屏幕上的相同大小?

回答

2

而不是硬编码大小,请使用contentSize。

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

这适用于所有标清和视网膜模式。

您可以使用此风格的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 
+0

关于contentSize - 你的代码导致非视网膜物理身体之中的大小非视网膜精灵,这是相同的好。然而,尽管约9个圆圈以视网膜模式填充屏幕的宽度,但约18个以非视网膜模式填充屏幕。它应该是每个9,这样的经验是相同的。我仍然不明白为什么会发生这种情况。在典型的iOS开发中,任何一种模式下的30点半径都是相同的,只是在视网膜模式下获得更高的分辨率。 – soleil 2013-03-04 18:49:00

+0

关于同步码,是否需要手动更新每帧中的定位?我希望能够在PhysicsSprite中自成一体。换句话说,我在哪里放置该代码? – soleil 2013-03-04 18:49:56

+0

对不起,我只用自定义CCSprite与b2body成员和重写更新功能。你的其他问题然后...... – Guru 2013-03-04 18:55:44