最近我发表了一个关于这个主题的问题,我收到了一个有用的答案,但是我的实验以一种我不理解的不同方式指出了我。
从答案中可以清楚地看出,我们应该对视网膜和非视网膜设备使用相同的 PTM_RATIO。但是,如果我们想展示世界的同一部分,我们可能会从 iPhone 到 iPad 将其翻倍。在我的例子中,我在 iPhone 上使用了 50,在 iPad 上使用了 100,因为 Box2d 模拟在身体在 0.1 到 10m 之间并且主精灵大约 2m 时效果更好。
我使用物理编辑器使用 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 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 坐标系。