1

ソースの四角形を取り、各画像がアニメーション用に切り取られるまで、スプライト シートの各フレームを動的にステップ実行するクッキー カッター タイプのクラスを作成したいと考えています。スプライト シートの各フレーム サイズが同じ場合は問題ありませんが、同じフレーム サイズのアニメーションで複雑なスプライト シートを見つけることはほぼ不可能です。例えば:

フレームサイズが一定の単純なスプライトシート

私が望むようにカットされ、アニメーション化されますが、

可変フレーム サイズのより複雑なビットマップ

フレームサイズが可変なので、おかしくなります(私のプログラムは現在、すべてのフレームが同じサイズであると想定しているため)。スプライト シートの個々のフレームのフレーム サイズを何らかの方法で感知する方法はありますか、それとも失われた原因ですか?

「クッキー カッター」ソース フレームを作成する現在のコード:

// Indirect Variable Sets (Sprite Animation and Sprite Sheet Cuts)
    framesPerRow = frameCount/spriteSheetRows;
    spriteWidth = bmp.getWidth() / framesPerRow;    // cut the sheet into pieces based on 
                                                    // sprite width: frames/row ratio
    spriteHeight = bmp.getHeight()/spriteSheetRows; // cut the sheet horizontally into pieces based on
                                                    // total height : total rows ratio

    setSourceRect(new Rect(0, 0, spriteWidth, spriteHeight));
    setFramePeriod(1000 / fps);                     // set the framePeriod based on desired fps

これは私の update メソッドで利用されます:

public void update(long gameTimeInMillis){
    // If the game time has been longer than the frame period...
    // the reason that we need frameTicker is so that we can use our variable (frameTicker)
    // to keep track of the last time that the frame was updated (relative to our game)
    if (gameTimeInMillis > frameTicker + framePeriod){
        frameTicker = gameTimeInMillis;             // set last update time (current time)
        // increment the animation frame
        currentFrame++;

        // Get current column in sprite sheet:
        // this works like this, imagine we are at frame 20, and we have 5 frames per row
        // 20%5 = 0 so we are at the end of the row, if we are at frame 22, 22%5 = 2, etc.
        frameColumn = currentFrame%framesPerRow;

        // if we are at our max frame count (note, we start at 0) then reset our animation
        if(currentFrame >= frameCount){ 
            currentFrame = 0;                   
        }

        // increment the sprite sheet row if we are at the end of the row
        if(frameColumn == 0){
            currentRow++;
        }

        // if we are at our max rows (note, we start at 0) then reset our animation rows
        if(currentRow >= spriteSheetRows){
            currentRow = 0;
        }

        // define the "cookie cutter" sourceRectangle for our sprite sheet
        this.sourceRect.left = frameColumn * spriteWidth;
        this.sourceRect.right = this.sourceRect.left + spriteWidth;
        this.sourceRect.top = currentRow * spriteHeight;
        this.sourceRect.bottom = this.sourceRect.top + spriteHeight;
        Log.d(TAG, "Top coordinates = " + currentRow);
    }
}

私はアーティストではないので、私の目標は、レンダリング済みのスプライト シートを使用して、2D アニメーション環境で自分のスキルを磨くことです。問題は、私が見つけたほとんどのスプライト シートには可変フレームがあるように見えるため、それらをより正確にカットする方法を見つけられない限り (または別のカット方法、不足している API ツールはありますか? )

4

2 に答える 2

0

シート内の各フレームのピクセル位置と幅/高さを定義するスプライト シートに合わせてメタデータを追加できます。完璧なグリッドを作るよりも手間はかかりますが、このままでさまざまなスプライト シートを使用できるようになります。たとえば、フレーム 1 をフェッチすると、ピクセル位置 128 から始まる 16x32 であることがわかり、シート全体の幅/高さに基づいてテクスチャ座標を計算できます。面倒に聞こえますが、一度機能するようになると、柔軟性が向上し、さまざまなスプライト シートで再利用できるようになります。

それ以外の場合は、Gimp を使用して個々のフレームをグリッドにカット アンド ペーストできます。または、フレームをすべて同じ幅/高さの個々の画像に切り取り、ImageMagick などを使用して個々の画像をスプライト シートに組み立てます。実際のコマンドは覚えていませんが、コマンド ラインから ImageMagick を使用して、Reiner のタイルセットのいくつかをスプライト シートに組み立てました。ImageMagick はディレクトリ内のすべての画像を連結し、サイズを変更するように指示することもできるので、必要に応じて高解像度の画像から始めて強制的に 2 の累乗にすることができます。

于 2014-02-16T02:37:56.980 に答える