2

SKTexture次のように、アトラスからロードされた別のテクスチャから作成された からスプライトを作成しています。

SKTexture *textureFromAtlas = [SKTexture textureWithImageNamed:@“MyImage.png”];
CGRect myRect = textureFromAtlas.textureRect;
myRect.size.with *= 0.5;
myRect.size.height *= 0.5;
SKTexture *newTexture = [SKTexture textureWithRect:myRect inTexture:textureFromAtlas];
SKSpriteNode * MySprite = [SKSpriteNode spriteNodeWithTexture:newTexture];

textureFromAtlasアプリケーション バンドルのImages.atlascフォルダー内で、 Images.1.pngMyImage.pngが回転したことを示し、 Images.plistはそのサブイメージに対してキーtextureRotatedが YES に設定されているため、たまたま回転しました。

MySprite正しい回転になるように作成するにはどうすればよいですか?

ここに画像の説明を入力

(A)は、SpriteKit が自動回転を行うため、予想されるものです。 (B)は実際の結果です。つまり、上記のコードで得られるものです。

編集:

MyImage.pngのサイズを取得するためにいくつかのコードを追加する必要がありましたが、アトラスに含まれる回転されたものは、回転されているかどうかを確認し、新しい回転myRectを計算して使用しますmySrpite

CGRect textureRect = textureFromAtlas.textureRect;
CGSize atlasSize = [[SKTexture textureWithRect:CGRectMake(0, 0, 1, 1)
                                     inTexture:textureFromAtlas] size];
CGSize sizeInAtlas = CGSizeMake(textureRect.size.width * atlasSize.width,
                                textureRect.size.height * atlasSize.height);
myRect = CGRectMake(myRect.origin.x,
                    myRect.origin.y+myRect.size.height-sizeInAtlas.height/atlasSize.height);
SKTexture *rotatedTexture = [SKTexture textureWithRect:myRect
                                             inTexture:textureFromAtlas];
mySprite = [SKSpriteNode spriteWithTexture: rotatedTexture];
mySprite.zRotation = M_PI_2;

これにより、四角形がImage.1.pngの回転した画像の左上隅に効果的に「移動」されるため、 (A)mySpriteの画像になりますが、これは MyImage.png が完全に不透明であるか、透明な境界線。SpriteKit は透明度のある画像でいくつかの最適化を行い、textureRect はアトラスの実際のフレームよりも小さいためです。

4

1 に答える 1

3

残念ながら、SKTextureAtlas から取得したテクスチャを使用する場合、textureWithRect:inTexture にバグがあるようです。あなたがやろうとしているのはスプライト マップからスプライト マップを作成することであり、これがパフォーマンスの問題を引き起こしているのを見ることができるので、この種のことは理にかなっています。

目的の結果を得るには、2 つの異なる方法で機能することがわかります。

最初のオプションは、MyImage をアトラス フォルダーの外に移動し (またはアセット catelog を使用)、textureWithRect:inTexture を使用します。これは、画像がスプライト シートとして既に作成されていて、切り刻んだくない場合に理想的です。これは悪い解決策ではありませんが、2 番目のオプションでより良い結果が得られる可能性があります。

SKTexture *textureFromAtlas = [SKTexture textureWithImageNamed:@“MyImage.png”];
CGRect myRect = CGRectMake(0,.5,.5,.5);
SKTexture *newTexture = [SKTexture textureWithRect:myRect inTexture:textureFromAtlas];
SKSpriteNode * MySprite = [SKSpriteNode spriteNodeWithTexture:newTexture];

2 番目のオプションは、画像を切り刻み、それらの画像を images.atlas に追加します。これは、1 つのスプライト シート (アトラス) で同時にレンダリングされる可能性のある他のテクスチャを取得する場合に、より理想的です。SpriteKit は、実行時にそれらを 1 つの画像としてまとめます。

ここに画像の説明を入力

赤/緑は切り刻まれた画像で、それが結合され、ピンク/緑は以前のように 1 つの画像にすぎません。

その後、次のようなコードを簡単に使用できるようになります...

SKTexture *textureFromAtlas = [SKTexture textureWithImageNamed:@"MyImage1.png"];
SKSpriteNode *mySprite = [SKSpriteNode spriteNodeWithTexture:textureFromAtlas];

どちらのオプションも、回転について心配する必要はありません。画像を取得するときに.atlasが回転しても、回転しません。

于 2015-03-08T05:25:28.253 に答える