私は 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
(画面上および画面外) を作成するメソッドが呼び出され、それらがすべてアニメーション化されます。これらのスプライトの 1 つである はhand
、Retina およびRetina 以外の画面。他の (雲のグループ) は正常に作成およびアニメーション化されますが、それらの位置はRetina ディスプレイでのみ正しいです。Retina 以外のディスプレイでは、各雲の開始位置が正しくなく ( x
、y
、または両方が正しくない場合もあります)、アニメーション後の終了位置も正しくありません。
新しいスプライトを作成してアニメーション化するオンタッチ メソッドから、責任あるコードを以下に含めました。繰り返しますが、Retina ディスプレイでは期待どおりに動作しますが、Retina 以外の画面では正しく動作しません。使用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 以外の画面で、この 1 つのスプライト グループが常に正しくない理由を突き止めていただき、ありがとうございます。
編集/更新 作成されたスプライトで何が起こっているかを正確に調査するために、かなりの追加のログを追加しました。クラウドの 1 つの例を次に示します。
// 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
I must say I am pretty baffled by this. I don't have those logs mixed up, either. The bounding box is bigger on non-Retina than it is on Retina? And those width/height values don't even match the size of the images they reference. Perhaps something strange is happening inside the spritesheets/textures? I also notice the origins do not match. Maybe that is affecting the output, as well? Very strange it's only happening to these sprites and no others.
Any thoughts & suggestions are appreciated.