Режим Cocos2D, Box2D и Retina: сдаться или попытаться заставить его работать? - PullRequest
6 голосов
/ 01 мая 2011

Я пытался заставить мою игру 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, но этого просто недостаточно. Есть идеи? Сейчас я собираюсь полностью отказаться от режима сетчатки для своей игры.

1 Ответ

7 голосов
/ 03 мая 2011

Я использую класс GLESDebugDraw, который поставляется с шаблоном Xcode Cocos2D + Box2D, и способ отрисовки отладки для увеличения в режиме Retina так же просто, как:

m_debugDraw = new GLESDebugDraw( PTM_RATIO * CC_CONTENT_SCALE_FACTOR() );
world->SetDebugDraw(m_debugDraw);

Мне не нужно использовать CC_CONTENT_SCALE_FACTOR() где-либо еще, поскольку, за исключением некоторых явно названных методов / свойств класса, таких как contentSizeInPixels и т. Д., Cocos2D использует основанное на точке координатное пространство, в котором значения координат остаются неизменными, будь то в режиме сетчатки или режим низкого разрешения, что означает, что один и тот же PTM_RATIO можно использовать для создания осветительных приборов или форм Box2D в обоих режимах.

...