Box2D坐标系概念:PTM_RATIO和视网膜显示

时间:2013-10-09 08:35:47

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

最近我发布了关于此主题的question,我收到了一个有用的answer,但我的实验以不同的方式指出了我,我不明白。

从答案很清楚,我们应该对视网膜和非视网膜设备使用相同的PTM_RATIO。但是,如果我们想展示世界的相同部分,我们可以将它从iPhone加倍到iPad。在我的情况下,我使用50用于iPhone和100用于iPad,因为Box2d模拟效果更好,如果主体在0.1到10米之间,主精灵大约2米。

我使用物理编辑器使用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非视网膜的结果与预期一致:

enter image description here

但对于iPhone视网膜和iPad视网膜,灯具加倍!!

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坐标系。

1 个答案:

答案 0 :(得分:1)

你误解了:GL函数(包括ccDraw *函数!)需要乘以内容比例因子,因为GL适用于像素分辨率,而UIKit视图和cocos2d节点使用点坐标。