cocos2d, box2d и режим retina: отказаться или попытаться заставить его работать?

Я пытался заставить мою игру 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 для своей игры.


person Rob    schedule 01.05.2011    source источник


Ответы (1)


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

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

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

person Lukman    schedule 03.05.2011
comment
Интересно, надо будет сегодня попробовать. Было бы замечательно, если бы это было так просто. - person Rob; 03.05.2011
comment
К сожалению, этого все еще недостаточно. Я все еще нахожу, что формы моих приборов box2d все еще в два раза больше в режиме сетчатки, чем они должны быть. Разве вам не нужно учитывать PTM_RATIO (будь то 32 или 64) при указании вершин для ваших приборов box2d? - person Rob; 04.05.2011
comment
@ unforgiven3, но я использую один и тот же PTM_RATIO независимо от того, [director enableRetinaDisplay:YES] или [director enableRetinaDisplay:NO]. Как насчет спрайтов Cocos2D: вы подготовили -hd версию всех используемых изображений спрайтов? - person Lukman; 04.05.2011
comment
HD-изображения действительно используются - я не понимаю, как вы можете использовать тот же PTM_RATIO. В не сетчатке это обычно 32 пикселя на метр, а в сетчатке 64 пикселя на метр... верно? Чтобы спрайт покрывал ту же площадь экрана в режиме сетчатки, он должен быть в два раза больше, чем в режиме без сетчатки... или я так думал? - person Rob; 04.05.2011
comment
@unforgiven3 cocos2d использует координаты на основе точек, где всегда 32 точки в режиме сетчатки или без нее. Используете ли вы вычисления на основе пикселей? - person Lukman; 04.05.2011
comment
Вау, кажется, теперь я понял — я смог заставить его работать, думая о точках, а не о пикселях. Спасибо, Лукман, я думаю, вы решили мою проблему! - person Rob; 04.05.2011