最近我发表了一篇 question关于这个话题,我收到了一个有用的 answer ,但我的实验以一种我不理解的不同方式指出了我。
答案很明显,我们应该为视网膜和非视网膜设备使用相同的 PTM_RATIO。然而,如果我们想展示世界的同一部分,我们可能会将它从 iPhone 翻倍到 iPad。在我的例子中,我为 iPhone 使用了 50,为 iPad 使用了 100,因为如果主体在 0.1 到 10m 之间并且主 Sprite 大约为 2m,Box2d 模拟效果更好。
我使用 Physics Editor 使用 GB2ShapeCache 为 Retina 设备构建了固定装置,但没有成功。然后我决定直接输入 Box2D 坐标,我得出了一个奇怪的结论,我想澄清一下。
我创建了一个调试方法(独立于任何 Sprite )来绘制一条从屏幕高度的 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 non retina 的结果符合预期:
但是对于 iPhone retina 和 iPad retina,固定装置翻倍了!!
最明显的修正应该除以 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 坐标系。
最佳答案
您误解了:GL 函数(这包括 ccDraw* 函数!)需要与内容比例因子相乘,因为 GL 适用于像素分辨率,而 UIKit View 和 cocos2d 节点使用点坐标。
关于ios - Box2D坐标系概念: PTM_RATIO and retina display,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19266899/