ソースの四角形を取り、各画像がアニメーション用に切り取られるまで、スプライト シートの各フレームを動的にステップ実行するクッキー カッター タイプのクラスを作成したいと考えています。スプライト シートの各フレーム サイズが同じ場合は問題ありませんが、同じフレーム サイズのアニメーションで複雑なスプライト シートを見つけることはほぼ不可能です。例えば:
私が望むようにカットされ、アニメーション化されますが、
フレームサイズが可変なので、おかしくなります(私のプログラムは現在、すべてのフレームが同じサイズであると想定しているため)。スプライト シートの個々のフレームのフレーム サイズを何らかの方法で感知する方法はありますか、それとも失われた原因ですか?
「クッキー カッター」ソース フレームを作成する現在のコード:
// 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 ツールはありますか? )