Я пытался заставить мою игру box2d работать в режиме сетчатки, и я сталкиваюсь с множеством раздражающих проблем при работе в режиме с более высоким разрешением.
cocos2d правильно отображает мою графику в режиме Retina, но я нахожу необходимость в хаке после хака, чтобы 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 работать в режиме сетчатки? Я использую предложенный Steffen Itterheim Box2DHelper class вместо PTM_RATIO
, но этого просто недостаточно. Есть идеи? Сейчас я собираюсь полностью отказаться от режима сетчатки для своей игры.