У меня есть небольшая проблема с моей игрой. В моей основной игровой сцене я создаю объект Player из класса, например:
player = [Player spriteWithFile:@"Icon-Small@2x.png"];
player.position = ccp(100.0f, 180.0f);
[player createBox2dObject:world];
Ниже приведен основной блок моего маленького класса Player, который создает тело и прибор, чтобы я мог использовать его в мире box2d.
b2BodyDef playerBodyDef;
playerBodyDef.type = b2_dynamicBody;
playerBodyDef.position.Set(self.position.x/PTM_RATIO, self.position.y/PTM_RATIO);
playerBodyDef.userData = self;
playerBodyDef.fixedRotation = true;
playerBodyDef.linearDamping = 4.0;
body = world->CreateBody(&playerBodyDef);
b2CircleShape circleShape;
circleShape.m_radius = 0.7;
b2FixtureDef fixtureDef;
fixtureDef.shape = &circleShape;
fixtureDef.density = 1.0f;
fixtureDef.friction = 1.0f;
fixtureDef.restitution = 1.0f;
body->CreateFixture(&fixtureDef);
Результатом этого кода является объект Box2d с Icon-Small@2x.png поверх него. Когда я перемещаю джойстик, применяется импульс Box2D, и игрок движется. Достаточно просто, верно?
На дисплеях без сетчатки это работает нормально. Однако, когда я переключаюсь на Retina в симуляторе, Icon-Small@2x.png создается немного выше и дальше вправо, а не над кругом Box2D. Затем применяется гравитация, и они оба падают на платформу. Icon-Small@2x.png падает в два раза быстрее. Когда я перемещаю джойстик, круг Box2D перемещается, но Icon-Small@2x.png перемещается в два раза быстрее, и камера следует за ним, вскоре оставляя круг за пределами экрана. Я сомневаюсь, что эта проблема действительно имеет какое-то отношение к коду, который я здесь имею, я чувствую, что проблема масштабирования скрыта где-то в моей игре. У кого-нибудь есть предложения?
Edit:
Я перемещаю спрайт с помощью:
[player moveRight];
Это moveRight в классе игрока:
-(void) moveRight {
b2Vec2 impulse = b2Vec2(2.0f, 0.0f);
body->ApplyLinearImpulse(impulse, body->GetWorldCenter());
}
Здесь не должно быть никаких проблем, верно?
Редактировать (снова):
Вот мое обновление: method-
- (void) update:(ccTime)dt {
int32 velocityIterations = 8;
int32 positionIterations = 1;
world->Step(dt, velocityIterations, positionIterations);
for (b2Body* b = world->GetBodyList(); b; b = b->GetNext()) {
if (b->GetUserData() != NULL) {
CCSprite *myActor = (CCSprite*)b->GetUserData();
myActor.position = CGPointMake( b->GetPosition().x *PTM_RATIO,
b->GetPosition().y * PTM_RATIO);
myActor.rotation = -1 * CC_RADIANS_TO_DEGREES(b->GetAngle());
}
}
b2Vec2 pos = [player body]->GetPosition();
CGPoint newPos = ccp(-1 * pos.x * PTM_RATIO + 50, self.position.y * PTM_RATIO);
[self setPosition:newPos];
}
У меня такое ощущение, что проблема где-то здесь. Я пытался изменить PTM_RATIO, но это не влияет на скорость. Есть идеи?
Редактировать: см. Комментарий ниже, почти выяснили