1

SpriteKit SKAction animateWithTextures は、テクスチャ アトラスを使用して最初のラウンドで正しくレンダリングされません。

スプライトを初期化し、テクスチャ アトラスを使用していないときに問題なく動作するアクションを実行するシーンがあります。問題は、シーンが最初にロードされたときに、スプライトのフレーム サイズがテクスチャ サイズと同じになるため、スプライトが引き伸ばされて描画されることです。戻るボタンがあるので、シーンを終了して再入力すると、通常どおりロードされます。Texture Atlases の他のスプライト テクスチャには影響せず、アニメーション化されたテクスチャのみに影響し、最初にレンダリングされたときにのみ発生するのは奇妙です。

注: ViewController.m ファイルで生成されるすべてのアニメーションを格納する配列を持つシングルトンを使用しています。

** 追加した **

さて、私は多くの実験を行い、自動アトラスジェネレーターが私のファイル名を解釈する方法に何か問題があるに違いないという結論に達しました.特に。

名前の「.atlas」部分を削除してアトラスフォルダーの名前を変更しようとしましたが、画像は完全にレンダリングされています。もちろん、これはより多くのドローコールを意味するため、理想的なソリューションではありません。

画像に名前を付ける方法は次のとおりです...

テーマ-名前-番号-解像度-デバイス-PNG

たとえば、画像は「SPOOKY_tree_0@2x~iphone.png」と呼ばれます。

次に、ヘルパーメソッドを使用してキャッシュシングルトンにロードします...

- (SKAction *)animationWithFile:(NSString *)name theme:(NSString *)theme frameCount:       (int)frameCount delay:(float)delay {

// Load the animation frames as textures and create the sprite frames
NSMutableArray *frames = [NSMutableArray arrayWithCapacity:frameCount];

for (int i = 0; i < frameCount; i++) {

    NSString *retina;
    if ([GLOBAL _hd]) {

        retina = @"@2x";

    } else { retina = @""; }

    NSString *deviceType;
    if ([GLOBAL _ipad]) {

        deviceType = @"~ipad";

    } else { deviceType = @"~iphone"; }

    // Create the file name
    NSString *file = [NSString stringWithFormat:@"%@%@_%d%@%@", theme, name, i, retina, deviceType];

    // Create the texture/frame
    SKTexture *frame = [SKTexture textureWithImageNamed:file];

    [frames addObject:frame];
}

// Return the animation object from all the sprite animation frames
return [SKAction animateWithTextures:frames timePerFrame:delay];
}

// Return the animation object from all the sprite animation frames
return [SKAction animateWithTextures:frames timePerFrame:delay];

そして、「name」変数を使用してキーの下のNSMutableDictionaryに保存します...

- (void)loadPegAnimations {

    NSString *newName;
    SKAction *newAnimation;
    int newFrameCount;
    CGFloat fps = 1.0/20.0;

    newName = kP1_DEPLOYING_PEG;
    newFrameCount = 9;
    newAnimation = [self animationWithFile:newName theme:pegTheme frameCount:newFrameCount delay:fps];
    [self addAnimation:newAnimation byName:newName];

    newName = kP1_LOSING_PEG;
    newFrameCount = 22;
    newAnimation = [self animationWithFile:newName theme:pegTheme frameCount:newFrameCount delay:fps];
    [self addAnimation:newAnimation byName:newName];

    newName = kP2_DEPLOYING_PEG;
    newFrameCount = 9;
    newAnimation = [self animationWithFile:newName theme:pegTheme frameCount:newFrameCount delay:fps];
    [self addAnimation:newAnimation byName:newName];

    newName = kP2_LOSING_PEG;
    newFrameCount = 22;
    newAnimation = [self animationWithFile:newName theme:pegTheme frameCount:newFrameCount delay:fps];
    [self addAnimation:newAnimation byName:newName];

}

そのアニメーションを使用したい場合は、「[[PEGOGGraphicLoader sharedGraphicLoader] frameByName:kP1_DEPLOYING_PEG]];」という行を使用してシングルトン キャッシュを呼び出します。これは SKAction * を返します。

どういうわけか、アニメーションの画像を呼び戻すときに、@ 2x を画像に再適用し、それらをスプライト フレームに押しつぶそうとしていますが、よくわかりません。また、これは、アニメーションが最初から正常にレンダリングされているという事実をまだ説明していません。

-textureWithImageNamed: メソッドから解像度要素とデバイス要素を除外しようとしましたが、画像はテクスチャ アトラスによってまったく検出されず、巨大な X として表示されます。テクスチャ アトラス ジェネレーターのバグではないことが確実にわかるまで、テクスチャ アトラスを有効にせずに作業するつもりです。

当面は、ハック タイプの命名規則を使用することを検討しています。これにより、デバイス タイプなどに応じてどのテクスチャを読み込むかをプログラムで決定し、デバイス タイプごとに異なるアトラス フォルダーを作成することができます。

誰かが同様の問題を抱えていたり、私が間違っていることを教えてくれたりした場合は、知りたい. 実際のデバイスでゲームをまだテストしていないため、シミュレータの問題である可能性があります。

4

2 に答える 2

2

TextureAtlas を使用しているスプライトで同じ問題が発生していることに気付きました。少しの間、さまざまな設定を試してみたところ、Resize: YESRestore: YESのブール値オプションを設定すると、サイズが正しくないスプライト アニメーションが修正されることがわかりました。お役に立てれば

于 2013-11-11T15:00:18.067 に答える
1

SpriteKit は Retina を自動的に処理すると思っていました。文字列 @2x を変更するコード行を削除してみてください。また、デバイス タイプを削除してみて、それも処理されないかどうかを確認してください。

また、animateWithTextures を使用する場合は、resize:NO と restore:NO を設定すると役立つことにも注意してください。

于 2013-10-06T01:25:01.527 に答える