ios - Box2D坐标系概念: PTM_RATIO and retina display

标签 ios cocos2d-iphone physics retina-display box2d-iphone

最近我发表了一篇 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 的结果符合预期:

enter image description here

但是对于 iPhone retina 和 iPad retina,固定装置翻倍了!!

enter image description here

最明显的修正应该除以 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/

相关文章:

ios - NSUserDefaults - 保存数据以供使用和重用 - 每次新启动时都会删除?

android - 使用加速度计(陀螺仪?)在 2D 空间中绘图

c++ - 花栗鼠碰撞太软

ios - iPhone图库在swift中选择图像位置

ios - 在主视图中处理touchesBegan - 如何获取触摸的 subview ?

swift - Spritekit、Cocos2D/Chipmunk 物理引擎不确定,切换到 Box2d

ios - Sprite Kit 物理变量与 Cocos2d+Box2d 的比较

ios - SpriteKit Physics 的神秘因子 150。重力和力量

ios - IB : adding constraint related to a second view 中的自动布局

ios - 如何在 swift iOS swift cocoa 框架中使用 Objective C 静态框架