Почему мой спрайт не выровнен с b2Body? - PullRequest
0 голосов
/ 03 февраля 2012

Я недавно начал программировать игры на iPhone, используя Cocos2d и Box2d.Итак, вот моя проблема:

У меня есть класс Player, который наследуется от CCSprite, и в этом классе есть этот метод:

-(void) createBox2dObject:(Player *)sender 
             forWorld:(b2World*)world {

b2BodyDef playerBodyDef;
playerBodyDef.type = b2_dynamicBody;
playerBodyDef.position.Set(sender.position.x/PTM_RATIO, sender.position.y/PTM_RATIO);
playerBodyDef.userData = sender;
body = world->CreateBody(&playerBodyDef);

b2PolygonShape dynamicBox;
dynamicBox.SetAsBox(sender.contentSize.width/PTM_RATIO,
                    sender.contentSize.height/PTM_RATIO);
b2FixtureDef polygonShapeDef;
polygonShapeDef.shape = &dynamicBox;
polygonShapeDef.density = 1.0f;
polygonShapeDef.friction = 1.0f;
polygonShapeDef.restitution = 0;
body->CreateFixture(&polygonShapeDef);
}

и вот как я это называю:

    self.player = [Player spriteWithSpriteFrameName:@"runningrupol-1.png"];        
    _player.position = ccp(_player.boundingBox.size.width/2 + 32, _player.boundingBox.size.height/2 + 32);
    self.walkAction = [CCRepeatForever actionWithAction:
                       [CCAnimate actionWithAnimation:walkAnim restoreOriginalFrame:NO]];
    [_player runAction:_walkAction];
    [spriteSheet addChild:_player];
    [_player createBox2dObject:_player forWorld:_world];

Очевидно, я использую анимированную таблицу спрайтов.

Вот как я обновляю мир:

- (void)tick:(ccTime) dt {

    _world->Step(dt, 8, 10);

    for(b2Body *b = _world->GetBodyList(); b; b=b->GetNext()) {    
        if (b->GetUserData() != NULL) {
            CCSprite *playerData = (CCSprite *)b->GetUserData();
            playerData.position = ccp(b->GetPosition().x * PTM_RATIO,
                                    b->GetPosition().y * PTM_RATIO);
            playerData.rotation = -1 * CC_RADIANS_TO_DEGREES(b->GetAngle());
        }        
    }

}

А вот как я называю это в методе init:

[self schedule:@selector(tick:)];

Вот что я вижу:

enter image description here

Пожалуйста, помогите.А если вам нужна дополнительная информация, просто скажите мне.

Ответы [ 2 ]

0 голосов
/ 04 февраля 2012

SetAsBox () использует половинную высоту и половинную ширину (я знаю, что это странно), поэтому разделите параметры на 2:

dynamicBox.SetAsBox(sender.contentSize.width/PTM_RATIO/2,
                sender.contentSize.height/PTM_RATIO/2);

При попытке оставить опорную точку как есть (по умолчанию)значение, если вы не установили явно, это должно быть ccp (0.5,0.5), центр вашего спрайта, и вы хотите это).

0 голосов
/ 03 февраля 2012

Вы можете изменить привязку для спрайта.Вот хороший учебник:

http://www.qcmat.com/understanding-anchorpoint-in-cocos2d/

...