【问题标题】:PTM_RATIO in retina display using Box2D, cocos2d and Physics Editor使用 Box2D、cocos2d 和物理编辑器在视网膜显示中的 PTM_RATIO
【发布时间】:2013-10-08 08:27:26
【问题描述】:

我在尝试在我的精灵上绘制身体形状时遇到了很多问题。我尝试了很多组合,但无法在视网膜显示器上使用。

我只支持 iPhone Retina 和 iPad(Retina 和不 Retina)。

A. PTM_RATIO

如果我想在所有设备中使用相同的物理特性,第一个问题是每个设备使用哪个 PTM_RATIO。我看了几篇文章,我不知道 PTM 是代表“Point To Meter”还是“Pixel To Meter”。

¿哪一列是正确的?

B.物理学

我想使用不同形状的不同图像绘制地面,但为此我使用了两种最简单的类型。一张 200x200px 的图片,但 body 只占用了下方 200x80px 的矩形。

为了保持精灵外观,我对 iPhone 和 iPad SD 使用 200x200px 艺术,对 iPad HD 使用 400x400。然后我尝试为红色区域定义一个主体。我使用 Physcs Editor 尝试了所有可能的组合,并尝试使用 Vertex Helper 手动完成。我让它适用于 iPad SD,但不适用于视网膜显示器(总是 x2)。

我的顶点:

int num = 4;
        b2Vec2 verts[] =
        {
            b2Vec2(-100.0f / 100.0, -20.0f / 100.0),    //A
            b2Vec2(100.0f / 100.0, -20.0f / 100.0), //B
            b2Vec2(100.0f / 100.0, -100.0f / 100.0),    //C
            b2Vec2(-100.0f / 100.0, -100.0f / 100.0),   //D
        };

我除以 100,因为我使用了 200x200 艺术。我试图除以 PTM_RATIO 和 PTM_RATIO * CC_CONTENT_SCALE_FACTOR() 没有有用的结果。我试着用 400x400 的艺术来做……我想我尝试了所有可能的组合。

出于调试目的,我使用 cocos2d+Box2d 模板提供的 GLES-Render 类。

我的图层中的draw方法:

- (void) draw
{
    [super draw];
    ccGLEnableVertexAttribs( kCCVertexAttribFlag_Position );
    kmGLPushMatrix();
    world->DrawDebugData();
    kmGLPopMatrix();
}

我应该使用吗?:

 glScalef(CC_CONTENT_SCALE_FACTOR(), CC_CONTENT_SCALE_FACTOR(), 1);

我真的觉得卡住了。

编辑:

Pysics Editor 组合和结果:

宏定义: iPhone 为 50 PTM_RATIO,iPad 2 和 iPad 3 为 100 PTM_RATIO。

【问题讨论】:

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


    【解决方案1】:

    首先要做的是:需要 PTM_RATIO:Box2D 使用任意坐标系。据说以米为单位,但这是一个任意定义,因为 Box2D 中的 1 米不能用尺子测量。只有当您将 Box2D 物体的位置转换到屏幕上时,您才能获得可测量的距离。而这个距离取决于屏幕的大小及其像素密度 (ppi)。

    对于 Retina,您不需要不同的 PTM_RATIO!

    这是因为在 UIKit 和 cocos2d(但不是纯 OpenGL)中,Retina iPhone 与非 Retina iPhone 具有相同的点大小。 iPad 和 iPad Retina 也是如此,它们的点坐标大小均为 1024x768 - iPad Retina 在内部仅使用 4 个像素来表示单个点。 UIKit 和 cocos2d 都使用点坐标来定位它们的视图,因此您完全不必担心转换为像素或内容比例因子。

    这意味着对非 Retina 和 Retina 设备使用相同的 PTM_RATIO。

    但是,您可能希望在 iPhone 和 iPad 之间更改 PTM_RATIO,例如,如果您不希望 iPad 版本的应用程序显示更大的屏幕部分,而是在场景中提供 2 倍缩放视图,那么您只需在 iPad 上使用两倍的 PTM_RATIO。这意味着在 iPhone 上,其位置时间 PTM_RATIO 转换为 480x320 的主体在 iPad 上不会位于 480x320,而是在位置 960x640,因为 iPad 的 PTM_RATIO 是两倍高。同样,只有当您尝试在 iPhone 和 iPad 屏幕之间使用非常相似的比例(大约大 2 倍)才是您想要的 - 否则不要更改 PTM_RATIO。

    现在 VertexHelper 并不能帮你解决这个问题,因为它没有考虑或包含 PTM_RATIO,所以它很容易出错(而且它是一个笨重的工具)。而是依靠使用 PhysicsEditor 及其形状缓存。确保您已将 PhysicsEditor 中的 PTM_RATIO 设置为您在应用中使用的相同。

    千万不要在任何地方使用 CC_CONTENT_SCALE_FACTOR 来增加位置。是的,一些 GL 功能需要它,但这些功能已经提供给您,它们无需任何更改即可正常工作。

    【讨论】:

    • 感谢 Steffen,您的快速回复。所以,从你的话我得出结论,如果我想代表同一个世界,我必须在 iPhone 上使用 PTM_RATIO,在 iPad 上使用 double。如果主要精灵是 iPhone 中 100pt 和 iPad 中 200pt 的汽车(约 2m 长的汽车),那么好的选择分别是 50 和 100 PTM。现在很清楚了。但在物理编辑器部分,我认为我还遗漏了其他东西。我尝试从不同的艺术和不同的 PTM_RATIO 构建身体,但只适用于非视网膜,即 iPad SD。见编辑。 Vielen danke。
    • @LearnCocos2D 我已经尝试对 iPhone 的 NON-Retina 和 Retina 显示器使用相同的 PTM_Ratio,但没有成功。我一直在 Retina 显示器中使用较小的多边形...所以您能否详细说明一下您的意思是 PTM_Ratio 可以保持不变的原因是什么?
    • 如果您使用 OpenGL 直接渲染多边形,您必须考虑到 GL 是基于像素的 API,因此需要在 Retina 上缩放 2 倍。但不适用于 cocos2d 或 UIKit API。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多