视网膜设备上的CCSpriteFrame rectInPixels

时间:2014-05-09 23:21:51

标签: ios objective-c cocos2d-iphone retina

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

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)

我已将{.1}中for循环的frame.rect和x / y放在视网膜设备上显示;

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}} 以像素(而非点数)计算。它是否正确?如果是这样,这似乎完全违反直觉,对我没有帮助,为什么不简单地计算点?那么我如何计算视网膜和非视网膜的正确矩形?

这真让我感到困惑,因为我很肯定这是在前一天工作,所有我改变了,因为它工作的是图像的尺寸。

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

1 个答案:

答案 0 :(得分: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倍像素的显示器上使用相同的纹理,因此纹理看起来将是非视网膜设备的一半大。 / p>