使用Box2D,cocos2d和Physics Editor在视网膜上显示PTM_RATIO

时间:2013-10-08 08:27:26

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

我试图在我的精灵上画出身体形状时遇到很多问题。我尝试了很多组合,但我无法在视网膜显示器上工作。

我只支持iPhone视网膜和iPad(视网膜而非视网膜)。

一个。 PTM_RATIO

第一个问题是如果我想在所有设备中使用相同的物理特性,PTM_RATIO会为每个设备使用哪个。我看了几篇帖子,我不知道PTM是代表“指向仪表”还是“ Pixel to Meter ”。

enter image description here

¿哪一列是正确的?

B中。物理

我想用不同形状的不同图像绘制地面,但为此我使用了两种最简单的类型。 200x200px的图像,但是主体仅采用较低的200x80px矩形。

enter image description here

为了保持精灵方面,我使用适用于iPhone和iPad SD的200x200px艺术和适用于iPad HD的400x400。然后我尝试为红色区域定义一个体。我尝试使用Physcs编辑器进行所有可能的组合,并尝试使用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类。

我的图层中的绘制方法:

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

我应该使用?:

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

我感到很困惑。

修改

Pysics Editor组合和结果:

Physcs Editor results

宏定义: 适用于iPhone的50 PTM_RATIO和适用于iPad 2和iPad 3的100 PTM_RATIO。

1 个答案:

答案 0 :(得分: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功能需要它,但是这些功能已经提供给你并且它们正常工作而不需要任何改变。