2013-04-20 3 views
1

Если я создаю спрайт и тело с первой партией кода, спрайт будет располагаться по центру кругового тела. Но если я создаю спрайт со второй партией кода, дно кругового тела прикрепляется к вершине спрайта. В обеих партиях кода используются следующиеcocos2d - CCSprite не выровнен с b2Body

Обновление 1 - Я изменил createBody так, чтобы теперь он занимал позицию в качестве входного сигнала. Затем я думаю, что я отправляю правильную позицию по каждой причине, но я все еще вижу верхнюю часть спрайта, подключенного к нижней части тела во второй партии кода.

Метод createBody:

- (void)createBody : (NSNumber *)xPos yPos:(NSNumber *)yPos { 

float radius = 16.0f; 

b2BodyDef bd; 
bd.type = b2_dynamicBody; 
bd.linearDamping = 0.1f; 
bd.fixedRotation = true; 
bd.position.Set([xPos doubleValue]/PTM_RATIO, [yPos doubleValue]/PTM_RATIO); 

body = _world->CreateBody(&bd); 

b2CircleShape shape; 
shape.m_radius = radius/PTM_RATIO; 

b2FixtureDef fd; 
fd.shape = &shape; 
fd.density = 1.0f; 
fd.restitution = 0.0f; 
fd.friction = 0.2; 

body->CreateFixture(&fd); 

}

первая партия кода -

Hero.mm -

- (id)initWithWorld:(b2World *)world { 
    if ((self = [super initWithSpriteFrameName:@"animal.png"])) { 
     NSNumber *xPos = [NSNumber numberWithDouble:self.position.x]; 
     NSNumber *yPos = [NSNumber numberWithDouble:self.position.y]; 
     [self createBody:xPos yPos:yPos]; 
    } 
} 

HellowWorld.mm

_hero = [[[Hero alloc] initWithWorld:_world] autorelease]; 
    [_terrain.batchNode addChild:_hero]; 

Вторая партия кода -

Hero.mm -

CCSprite *sprite = [CCSprite spriteWithSpriteFrameName:@"animal.png"]; 
[self addChild:sprite]; 
NSNumber *xPos = [NSNumber numberWithDouble: sprite.position.x]; 
NSNumber *yPos = [NSNumber numberWithDouble: sprite.position.y]; 
[self createBody:xPos yPos:yPos]; 

Основное различие между этими двумя партиями кода является то, что в первую очередь использует initWithSpriteFrameName, а второй использует spriteWithSpriteFrameName. Кто-нибудь знает, как центрировать спрайт на теле, используя spriteWithSpriteFrameName?

Самое странное в том, что эта линия в методе createBody

 bd.position.Set([xPos doubleValue]/PTM_RATIO, [yPos doubleValue]/PTM_RATIO); 

не кажется, положение тела на спрайт, но положение тела и спрайт в мировой системе координат.

ответ

0

Единственное отличие, которое я замечаю, заключается в следующем.

В вашем первом случае вы инициализируете своего героя как спрайт и звоните createBody, который, в свою очередь, использует self.position, т.е. положение самого спрайта.

В вашем втором случае вы добавляете спрайт в качестве ребенка - createBody теперь использует положение родительского объекта, а не спрайт, который вы добавляете.

Смежные вопросы