【发布时间】:2011-05-01 17:27:04
【问题描述】:
我一直试图让我的 box2d 游戏在视网膜模式下运行,但在更高分辨率模式下运行时遇到了很多恼人的问题。
cocos2d 可以在视网膜模式下正确渲染我的图形,但我发现需要在 hack 之后进行 hack,以使 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);
这种 hack(通过 CC_CONTENT_SCALE_FACTOR() 调整所有顶点)当然不可避免地会导致密度 hack,以保持类似于低分辨率模式的运动:
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,但这似乎还不够。有任何想法吗?在这一点上,我即将完全放弃我的游戏的视网膜模式。
【问题讨论】:
标签: ios retina-display box2d-iphone