0

最近我发表了一个关于这个主题的问题,我收到了一个有用的答案,但是我的实验以一种我不理解的不同方式指出了我。

从答案中可以清楚地看出,我们应该对视网膜和非视网膜设备使用相同的 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 坐标系。

4

1 回答 1

1

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

于 2013-10-09T10:23:34.963 回答