1

私は 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 以外のディスプレイでは、各雲の開始位置が正しくなく ( xy、または両方が正しくない場合もあります)、アニメーション後の終了位置も正しくありません。

新しいスプライトを作成してアニメーション化するオンタッチ メソッドから、責任あるコードを以下に含めました。繰り返しますが、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.

4

4 に答える 4

2

私は2つの原因を想像することができます:

  1. SD画像はHD画像のちょうど半分のサイズではありません
  2. plist内の画像の名前が間違っています

HD画像の幅と高さがSD画像のちょうど2倍であることを確認します(またはその逆)。HDからダウンスケーリングしているため、HD画像のサイズが2で割り切れるのを確認してください。

一般的な命名エラーはplistで発生します。通常、image.pngとimage-hd.pngがあります。ただし、テクスチャアトラスでは、これは少し異なります。atlas.pngファイルとatlas-hd.pngファイル、および関連するplistファイルが必要ですが、テクスチャアトラス内の画像は両方のバージョンでimage.pngを参照している必要があります。一般的なエラーは、image-hd.pngをatlas-hd.pngテクスチャアトラスに追加することです。

これらの問題のいずれかが当てはまるかどうかわからない。確かに、スプライトの位置にログを追加してから、Retinaと標準の解像度の位置を比較したいようです。これらの位置が他のバージョンの位置の半分または2倍正確にオフセットされている場合は、RetinaとNon-Retinaのポジショニングのバグがあることがわかります。そうでない場合は、ポジショニングまたは移動コードにバグがある可能性が高くなります。

于 2012-06-11T10:36:29.667 に答える
0

テストアプリを作成してテストしました。

Retina のないデバイスの場合: ImageName.png - iPhone/iPod の場合 ImageName~ipad.png -- iPad の場合

Retina ディスプレイのデバイスの場合: ImageName@2x.png - iPhone/iPod の場合 ImageName@2x~ipad.png -- iPad の場合

また、iPhone の高解像度画像と iPad の高解像度画像が同じサイズの場合は、@2x を使用できます。画像をロードするには、[UIImage imageNamed:@"ImageName.png"]; を使用します。iOS 5.1、5.0、および 4.3 の iOS シミュレーターでテストしました。ところで、@2x を使用する必要があるのはなぜですか。

iPhone と iPad はサイズが異なるため、iPhone と iPad で同じグラフィックスを使用しないでください。また、同じサイズを使用する場合、グラフィックは既に iPad Retina ディスプレイ用に作成されています (以前に iPhone Retina ディスプレイを使用していた場合)。異なるサイズの画像を作成する場合は、iPhone と iPad で異なる画像名を使用します。したがって、こちら側に @2x サフィックスを追加するだけです。そのため、@2x サフィックスのみを使用する必要があります。- これらは私の考えです。

于 2012-06-13T11:18:04.237 に答える
0

私の推測では、スプライトシートを置き換えることでうまくいったのですが、シミュレーターがアプリの元のビルドを完全に上書きするまで、違いは見られませんでした。画像がシミュレーターにキャッシュされ、アプリを削除する必要があり (小刻みに動かして [X] を押す)、魔法のように更新された画像が表示されるという問題がありました。

疑わしい場合は、デバイスでテストしてください。シミュレーターは、多くの「ハイストレンジネス」の原因です。それだけの価値はありません。

于 2012-06-13T01:39:28.863 に答える
0

問題はなくなりましたが、これについて実行可能な答えはありません。

もう一度、すべての画像を 2 の累乗にトリミングし、その過程で余分なスペースを削りました。テクスチャ/スプライト シート作成ツールを Zwoptex から TexturePacker に交換し、新しい .plist ファイルを使用して、PNG ではなく PVR として 2 つの新しいスプライト シートを作成しました。

また、cocos2d ライブラリを最新の安定版にアップグレードすることにしました (以前は、1.0.1 安定版リリースより前の古い RC バージョンを使用していました)。

コードを変更することなく、問題は解消されました。変。

于 2012-06-12T06:19:55.453 に答える