Я пытался заставить мою игру box2d работать в режиме сетчатки, и я столкнулся с множеством раздражающих проблем при работе в режиме с более высоким разрешением.
cocos2d правильно отображает мою графику в режиме сетчатки, но я нахожу необходимость взлома за взломом, чтобы заставить box2d работать так же, как в режиме с более низким разрешением. Например, я обнаружил, что мне нужно сделать что-то подобное, чтобы получить правильный размер фигуры отладки в режиме сетчатки:
b2Vec2 vertices[4];
vertices[0].Set(-0.5f / CC_CONTENT_SCALE_FACTOR(), 1.0f / CC_CONTENT_SCALE_FACTOR());
vertices[1].Set(-0.5f / CC_CONTENT_SCALE_FACTOR(), -1.0f / CC_CONTENT_SCALE_FACTOR());
vertices[2].Set(0.5f / CC_CONTENT_SCALE_FACTOR(), -1.0f / CC_CONTENT_SCALE_FACTOR());
vertices[3].Set(0.5f / CC_CONTENT_SCALE_FACTOR(), 1.0f / CC_CONTENT_SCALE_FACTOR());
int32 count = 4;
b2PolygonShape polygon;
polygon.Set(vertices, count);
Этот хак (регулировка всех точек вершин на CC_CONTENT_SCALE_FACTOR()
), конечно же, неизбежно приводит к хаку с плотностью, чтобы сохранить движение, похожее на режим с более низким разрешением:
b2FixtureDef fixtureDef;
fixtureDef.shape = &polygon;
fixtureDef.density = 1.0f * CC_CONTENT_SCALE_FACTOR();
fixtureDef.friction = 0.9f;
playerBody->CreateFixture(&fixtureDef);
И это приводит к еще одному хаку настройки при приложении сил:
b2Vec2 force = b2Vec2(10.0f / CC_CONTENT_SCALE_FACTOR(), 15.0f / CC_CONTENT_SCALE_FACTOR());
playerBody->ApplyLinearImpulse(force, playerBody->GetPosition());
Имейте в виду, что я рисую в режиме отладки, масштабируя вызовы отладки, например:
glPushMatrix();
glScalef(CC_CONTENT_SCALE_FACTOR(), CC_CONTENT_SCALE_FACTOR(), 1.0f);
world->DrawDebugData();
glPopMatrix();
Что я принципиально не понимаю в том, чтобы заставить box2d работать с режимом сетчатки? Я использую предложенный Штеффеном Иттерхеймом Класс Box2DHelper вместо PTM_RATIO
, но этого кажется недостаточно. Есть идеи? На данный момент я собираюсь полностью отказаться от режима Retina для своей игры.