Скорость объекта Box2D - PullRequest
       10

Скорость объекта Box2D

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

У меня есть небольшая проблема с моей игрой. В моей основной игровой сцене я создаю объект 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, но это не влияет на скорость. Есть идеи?

Редактировать: см. Комментарий ниже, почти выяснили

1 Ответ

1 голос
/ 18 февраля 2012

Ваша проблема, вероятно, связана с тем, что вы используете изображение @ 2x ... Чтение, http://www.cocos2d -iphone.org / wiki / doku.php / prog_guide: how_to_develop_retinadisplay_games_in_cocos2d

Там указано:

ВНИМАНИЕ: НЕ рекомендуется использовать суффикс «@ 2x».Apple обрабатывает эти изображения особым образом, что может вызвать ошибки в вашем приложении cocos2d.

Поэтому, чтобы решить вашу проблему, прочитайте информацию об использовании файлов png с суффиксом -hd.

Длякомментарий:

У вас есть какой-то код, который выглядит примерно так ...

  world->Step(dt, 10, 10);
  for(b2Body *b = world->GetBodyList(); b; b=b->GetNext()) {    
    if (b->GetUserData() != NULL) {
      CCSprite *sprite = (CCSprite *)b->GetUserData();
      sprite.position = ccp(b->GetPosition().x * PTM_RATIO,b->GetPosition().y * PTM_RATIO);
    }
  }

Посмотрите, как код проходит по всем телам box2d в слове и устанавливает позицию спрайта, которыйсвязан с телом box2d?

...