cocos2d,box2d和retina模式:放弃,还是试着让它起作用?

Rob*_*Rob 6 box2d-iphone ios retina-display

我一直试图让我的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);
Run Code Online (Sandbox Code Playgroud)

那个hack(调整所有顶点CC_CONTENT_SCALE_FACTOR())当然不可避免地导致密度破解,以保持类似于低分辨率模式的移动:

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

这会在施加力量时导致另一次调整攻击:

b2Vec2 force = b2Vec2(10.0f / CC_CONTENT_SCALE_FACTOR(), 15.0f / CC_CONTENT_SCALE_FACTOR());
playerBody->ApplyLinearImpulse(force, playerBody->GetPosition());
Run Code Online (Sandbox Code Playgroud)

请记住,我通过缩放调试绘制调用来绘制调试模式,如下所示:

glPushMatrix();  
glScalef(CC_CONTENT_SCALE_FACTOR(), CC_CONTENT_SCALE_FACTOR(), 1.0f);
world->DrawDebugData();
glPopMatrix();
Run Code Online (Sandbox Code Playgroud)

什么是我从根本上误解了如何让box2d与视网膜模式一起工作?我正在使用Steffen Itterheim建议的Box2DHelper代替PTM_RATIO,但这似乎还不够.有任何想法吗?此时我将完全放弃视网膜模式.

Luk*_*man 7

我正在使用GLESDebugDrawCocos2D + Box2D Xcode模板附带的类以及在视网膜模式下进行调试绘制以扩展的方式就像:

m_debugDraw = new GLESDebugDraw( PTM_RATIO * CC_CONTENT_SCALE_FACTOR() );
world->SetDebugDraw(m_debugDraw);
Run Code Online (Sandbox Code Playgroud)

我不需要CC_CONTENT_SCALE_FACTOR()在其他任何地方使用,因为除了一些明确命名的类方法/属性之外contentSizeInPixels,Cocos2D使用基于点的坐标空间,其中坐标值保持相同,无论是在视网膜模式还是低分辨率模式,这意味着同样PTM_RATIO可用于在两种模式下创建Box2D灯具或形状.