6

I've been trying to get my box2d game to work in retina mode, and I'm running into a lot of irritating issues when running in higher-resolution mode.

cocos2d renders my graphics correctly in retina mode, but I'm finding the need for hack after hack to get box2d to work the same as in lower-resolution mode. For example, I'm finding I need to do something like this to get the debug draw shape size correct in retina mode:

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);

That hack (adjusting all vertex points by CC_CONTENT_SCALE_FACTOR()), of course inevitably leads to a density hack, to keep movement similar to lower-resolution mode:

b2FixtureDef fixtureDef;
fixtureDef.shape = &polygon;
fixtureDef.density = 1.0f * CC_CONTENT_SCALE_FACTOR();
fixtureDef.friction = 0.9f;
playerBody->CreateFixture(&fixtureDef);

And that leads to another adjustment hack when applying forces:

b2Vec2 force = b2Vec2(10.0f / CC_CONTENT_SCALE_FACTOR(), 15.0f / CC_CONTENT_SCALE_FACTOR());
playerBody->ApplyLinearImpulse(force, playerBody->GetPosition());

Keep in mind, I'm drawing in debug mode by scaling my debug draw calls, like so:

glPushMatrix();  
glScalef(CC_CONTENT_SCALE_FACTOR(), CC_CONTENT_SCALE_FACTOR(), 1.0f);
world->DrawDebugData();
glPopMatrix();

What is it that I'm fundamentally misunderstanding about getting box2d to work with retina mode? I'm using Steffen Itterheim's suggested Box2DHelper class in place of PTM_RATIO, but that just doesn't seem to be enough. Any ideas? I'm about to give up entirely on retina mode for my game at this point.

4

1 回答 1

7

我正在使用GLESDebugDrawCocos2D+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 固定装置或形状。

于 2011-05-03T15:21:37.837 回答