我一直试图让我的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与视网膜模式一起工作?我正在使用Steffen的建议 class来代替PTM_RATIO
,但这似乎还不够。有什么想法吗?我即将完全放弃视网膜模式,在这一点上我的游戏。
发布于 2011-05-03 15:21:37
我使用的是带有GLESDebugDraw
Xcode模板的Cocos2D+Box2D类,以及在视网膜模式下进行调试绘图的方式,它非常简单:
m_debugDraw = new GLESDebugDraw( PTM_RATIO * CC_CONTENT_SCALE_FACTOR() );
world->SetDebugDraw(m_debugDraw);
我不需要在其他地方使用CC_CONTENT_SCALE_FACTOR()
,因为除了在某些显式命名的类方法/属性(如contentSizeInPixels
等)中,Cocos2D使用基于点的坐标空间,其中无论在视网膜模式还是在低res模式下,坐标值都是相同的,这意味着相同的PTM_RATIO
可以用于在这两种模式中创建Box2D固定装置或形状。
https://stackoverflow.com/questions/5850066
复制相似问题