我正在使用以下代码创建爆炸精灵动画,图像为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}}
以像素(而非点数)计算。它是否正确?如果是这样,这似乎完全违反直觉,对我没有帮助,为什么不简单地计算点?那么我如何计算视网膜和非视网膜的正确矩形?
这真让我感到困惑,因为我很肯定这是在前一天工作,所有我改变了,因为它工作的是图像的尺寸。
已经很晚了,所以我可能只是遗漏了一些非常明显的东西,但我似乎无法弄清楚这一点,所以任何帮助都会非常感激!
答案 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>