最近我发布了关于此主题的question,我收到了一个有用的answer,但我的实验以不同的方式指出了我,我不明白。
从答案很清楚,我们应该对视网膜和非视网膜设备使用相同的PTM_RATIO。但是,如果我们想展示世界的相同部分,我们可以将它从iPhone加倍到iPad。在我的情况下,我使用50用于iPhone和100用于iPad,因为Box2d模拟效果更好,如果主体在0.1到10米之间,主精灵大约2米。
我使用物理编辑器使用GB2ShapeCache构建灯具,但视网膜设备没有成功。然后我决定直接提供Box2D坐标,我得出了一些我想澄清的奇怪结论。
我创建了一个调试方法(独立于任何精灵),从1/3的屏幕高度到1/3的屏幕宽度绘制一条线。
- (void)debugGround
{
// iPad: 1024x768
// iPhone: 480x320
CGSize winSize = [CCDirector sharedDirector].winSize; // unit is points
b2EdgeShape groundShape;
b2FixtureDef groundFixtureDef;
groundFixtureDef.shape = &groundShape;
groundFixtureDef.density = 0.0;
b2Vec2 left = b2Vec2(0, winSize.height/3/PTM_RATIO);
b2Vec2 right = b2Vec2(winSize.width/3/PTM_RATIO, winSize.height/3/PTM_RATIO);
groundShape.Set(left, right);
groundBody->CreateFixture(&groundFixtureDef);
}
如果Box2D以点为坐标并将其转换为除以PTM_RATIO,则iPhone和iPad视网膜和非视网膜的结果应相同。
iPad非视网膜的结果与预期一致:
但对于iPhone视网膜和iPad视网膜,灯具加倍!!
最明显的修正应该除以2,这意味着除以CC_CONTENT_SCALE_FACTOR。
我设法让所有重构代码的设备都能运行:
- (void)debugGround
{
CGSize winSize = [CCDirector sharedDirector].winSize;
b2EdgeShape groundShape;
b2FixtureDef groundFixtureDef;
groundFixtureDef.shape = &groundShape;
groundFixtureDef.density = 0.0;
b2Vec2 left = b2Vec2(0, winSize.height/3/PTM_RATIO/CC_CONTENT_SCALE_FACTOR());
b2Vec2 right = b2Vec2(winSize.width/3/PTM_RATIO/CC_CONTENT_SCALE_FACTOR(), winSize.height/3/PTM_RATIO/CC_CONTENT_SCALE_FACTOR());
groundShape.Set(left, right);
groundBody->CreateFixture(&groundFixtureDef);
}
我还设法正确显示了较低的平台除以顶点,偏移量以及我使用PTM_RATIO转换为Box2D坐标的任何位置。
我认为我不应该以任何方式使用CC_CONTENT_SCALE_FACTOR来乘以位置,因为GL函数已经考虑到这一点。
任何人都可以澄清这种行为吗?在哪些概念我错了?
我希望这有助于社区了解更好的Box2D坐标系。
答案 0 :(得分:1)
你误解了:GL函数(包括ccDraw *函数!)需要乘以内容比例因子,因为GL适用于像素分辨率,而UIKit视图和cocos2d节点使用点坐标。