我有一个使用 cocos2d-iphone 构建的相当简单的应用程序,但是我无法解决一个奇怪的定位问题。该应用程序使用精灵表,并且应用程序中有一个 Retina 和非 Retina 精灵表使用完全相同的图稿(当然分辨率除外)。应用程序中还有其他用于CCSprites
标准和 -hd 后缀的艺术品。
在应用程序中,当应用程序启动时会创建一组精灵。这些最初创建CCSprites
的在 Retina 和非 Retina 屏幕上的位置始终相同(且正确)。
// In method called to setup sprites when app launches
// Cache & setup app sprites
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile: @"sprites.plist"];
sprites = [CCSpriteBatchNode batchNodeWithFile: @"sprites.png"];
hill = [CCSprite spriteWithSpriteFrameName: @"hill.png"];
hill.position = ccp( 160, 75 );
[sprites addChild: hill z: 1];
// ... [create more sprites in same fashion]
// NOTE: All sprites created here have correct positioning on Retina & non-Retina screens
当用户以某种方式点击屏幕时,会调用一个方法来创建另一组CCSprites
(屏幕上和屏幕外),并为它们全部设置动画。其中一个精灵 ,hand
始终在 Retina &非视网膜屏幕。其他(一组云)成功创建和动画,但它们的位置仅在 Retina 显示器上是正确的。在非 Retina 显示器上,每个云的起始位置不正确(对于x
、y
或有时两者都不正确),并且它们在动画后的结束位置也是错误的。
我在下面的 on-touch 方法中包含了负责的代码,该方法创建了新的 sprite 并将它们动画化。同样,它在 Retina 显示器上按预期工作,但在非 Retina 屏幕上不正确。used 在应用程序启动时以相同的CCSprites
方式创建,以设置应用程序中的所有初始精灵,它们始终具有正确的位置。
// Elsewhere, in a method called on touch
// Create clouds
cloud1 = [CCSprite spriteWithSpriteFrameName: @"cloud_1.png"];
cloud1.position = ccp(-150, 320);
cloud1.scale = 1.2f;
cloud2 = [CCSprite spriteWithSpriteFrameName: @"cloud_2.png"];
cloud2.position = ccp(-150, 335);
cloud2.scale = 1.3f;
cloud3 = [CCSprite spriteWithSpriteFrameName: @"cloud_4.png"];
cloud3.position = ccp(-150, 400);
cloud4 = [CCSprite spriteWithSpriteFrameName: @"cloud_5.png"];
cloud4.position = ccp(-150, 420);
cloud5 = [CCSprite spriteWithSpriteFrameName: @"cloud_3.png"];
cloud5.position = ccp(400, 350);
cloud6 = [CCSprite spriteWithSpriteFrameName: @"cloud_1.png"];
cloud6.position = ccp(400, 335);
cloud6.scale = 1.1f;
cloud7 = [CCSprite spriteWithSpriteFrameName: @"cloud_2.png"];
cloud7.flipY = YES;
cloud7.flipX = YES;
cloud7.position = ccp(400, 380);
// Create hand
hand = [CCSprite spriteWithSpriteFrameName:@"hand.png"];
hand.position = ccp(160, 650);
[sprites addChild: cloud1 z: 10];
[sprites addChild: cloud2 z: 9];
[sprites addChild: cloud3 z: 8];
[sprites addChild: cloud4 z: 7];
[sprites addChild: cloud5 z: 6];
[sprites addChild: cloud6 z: 10];
[sprites addChild: cloud7 z: 8];
[sprites addChild: hand z: 10];
// ACTION!!
[cloud1 runAction:[CCMoveTo actionWithDuration: 1.0f position: ccp(70, 320)]];
[cloud2 runAction:[CCMoveTo actionWithDuration: 1.0f position: ccp(60, 335)]];
[cloud3 runAction:[CCMoveTo actionWithDuration: 1.0f position: ccp(100, 400)]];
[cloud4 runAction:[CCMoveTo actionWithDuration: 1.0f position: ccp(80, 420)]];
[cloud5 runAction:[CCMoveTo actionWithDuration: 1.0f position: ccp(250, 350)]];
[cloud6 runAction:[CCMoveTo actionWithDuration: 1.0f position: ccp(250, 335)]];
[cloud7 runAction:[CCMoveTo actionWithDuration: 1.0f position: ccp(270, 380)]];
[hand runAction: handIn];
值得一提的是,在运行应用程序并在标准 iPhone 和 iPhone (Retina) 硬件选项之间切换时,我在 iOS 模拟器中看到了这种不正确的定位行为。我无法验证这种情况是否发生在实际的非 Retina iPhone 上,因为我没有。
然而,这是我唯一一次看到这种奇怪的定位行为发生(用户触摸后获得的不正确结果),并且由于我以完全相同的方式创建所有精灵(即,[CCSprite spriteWithSpriteFrameName:]
然后position
使用设置cpp()
),我会特别感谢任何帮助追踪为什么这组精灵在非 Retina 屏幕上总是不正确的原因。
编辑/更新 我添加了一些额外的日志记录来准确调查创建的精灵发生了什么。以下是其中一种云的示例:
// Non-Retina
cloud1 position -- x: 70.000000 y: 320.000000
cloud1 anchor -- x: 0.500000 y: 0.500000
cloud1 size -- w: 384.000000 h: 576.000000
cloud1 origin -- x: -122.000008 y: 31.999989
// Retina
cloud1 position -- x: 70.000000 y: 320.000000
cloud1 anchor -- x: 0.500000 y: 0.500000
cloud1 size -- w: 172.800003 h: 121.800003
cloud1 origin -- x: -16.400003 y: 259.100006
我必须说我对此感到非常困惑。我也没有混淆这些日志。非 Retina 上的边界框比 Retina 上的大?而且这些宽度/高度值甚至与它们引用的图像的大小不匹配。也许精灵表/纹理内部发生了一些奇怪的事情?我也注意到起源不匹配。也许这也影响了输出?很奇怪,它只发生在这些精灵身上,没有其他精灵。
任何想法和建议表示赞赏。