0

我正在使用以下代码创建一个爆炸精灵动画,图像为 440x440 像素(110x110 像素帧的 4x4 网格),带有 880x880 的 -hd 图像(正在加载到视网膜设备上);

CCTexture *explosionTexture = [CCTexture textureWithFile:@"explosion.png"];
NSMutableArray *frames = [NSMutableArray array];
int frameCount = 0;
for (int y = 0; y < 4; y++) {
    for (int x = 0; x < 4; x++) {
        CCSpriteFrame *frame = [CCSpriteFrame frameWithTexture:explosionTexture
                                                  rectInPixels:CGRectMake(x*110, y*110, 110, 110)
                                                       rotated:NO
                                                        offset:CGPointZero
                                                  originalSize:CGSizeMake(440, 440)];
        [frames addObject:frame];
        frameCount++;
        if (frameCount == 14) break;
    }
}

这在非视网膜 iPhone 上工作正常,但是当我在视网膜 iPhone 上测试时,矩形是错误的(每帧是它应该大小的 1/4)

我已将 for 循环中的 frame.rect 和 x / y 放入 an 中NSLog,并在视网膜设备上显示;

2014-05-09 23:22:10.872 SimpleGame[4131:70b] x:0, y:0
2014-05-09 23:22:10.872 SimpleGame[4131:70b] frame.rect:{{0, 0}, {55, 55}}
2014-05-09 23:22:10.873 SimpleGame[4131:70b] x:1, y:0
2014-05-09 23:22:10.873 SimpleGame[4131:70b] frame.rect:{{55, 0}, {55, 55}}
2014-05-09 23:22:10.874 SimpleGame[4131:70b] x:2, y:0
2014-05-09 23:22:10.874 SimpleGame[4131:70b] frame.rect:{{110, 0}, {55, 55}}

这在非视网膜设备上;

2014-05-09 23:22:10.872 SimpleGame[4131:70b] x:0, y:0
2014-05-09 23:22:10.872 SimpleGame[4131:70b] frame.rect:{{0, 0}, {110, 110}}
2014-05-09 23:22:10.873 SimpleGame[4131:70b] x:1, y:0
2014-05-09 23:22:10.873 SimpleGame[4131:70b] frame.rect:{{110, 0}, {110, 110}}
2014-05-09 23:22:10.874 SimpleGame[4131:70b] x:2, y:0
2014-05-09 23:22:10.874 SimpleGame[4131:70b] frame.rect:{{220, 0}, {110, 110}}

文档确实说(并且名称很明显)rectInPixels是以像素(而不是点)计算的。这个对吗?如果是这样,这对我来说似乎完全违反直觉和无益,为什么不简单地计算点数呢?那么我如何计算视网膜和非视网膜的正确矩形?

这真的让我很困惑,因为我很肯定这就像一天前一样工作,自从它工作以来我所做的一切都是图像的尺寸。

已经很晚了,所以我可能只是错过了一些非常明显的东西,但我似乎无法弄清楚这一点,所以任何帮助将不胜感激!

4

1 回答 1

0

您登录的框架矩形再次以点为单位,因此根据您的代码这实际上是正确的。您缺少的是将像素大小与contentScale相乘以创建 Retina 纹理的实际像素坐标和大小:

CGFloat texScale = explosionTexture.contentScale;
CGRect rectInPixels = CGRectMake(x*110*texScale, y*110*texScale, 110*texScale, 110*texScale);

这是假设您有一个带有 -hd 后缀 (explosion-hd.png) 的 2x 缩放纹理。如果您只有一个图像,则上面的代码不会改变任何内容,因为您将在具有 4 倍像素的显示器上使用相同的纹理,因此纹理看起来是非视网膜设备上的一半。

于 2014-05-10T06:27:42.000 回答