このイメージの一部をJavaで抽出する方法は? [閉まっている]
質問
解決
スプライト領域が < code> BufferedImage 、 getSubimage
メソッドを使用して、スプライトシートのサブイメージを取得できます。
getSubimage
メソッドは、 x
、 y
、および width
と height
を使用して、目的のサブイメージを取得し、目的のスプライトを取得できます。ほとんどのスプライトは同じサイズであるように見えるため、ネストされた for
ループによってほとんどのスプライトを取得して、大きな画像を反復処理できると思います。
たとえば、 ImageIO
クラス( read
メソッド)、各スプライトのサイズは10ピクセルx 10ピクセルで、5行5列のスプライトです。 、スプライトは次の方法で取得できます。
BufferedImage bigImg = ImageIO.read(new File("sheet.png"));
// The above line throws an checked IOException which must be caught.
final int width = 10;
final int height = 10;
final int rows = 5;
final int cols = 5;
BufferedImage[] sprites = new BufferedImage[rows * cols];
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
sprites[(i * cols) + j] = bigImg.getSubimage(
j * width,
i * height,
width,
height
);
}
}
キャッチはもちろん、すべてのスプライトが同じサイズの場合にのみ上記のコードが機能するため、特定のスプライトシートで機能するには調整を行う必要があります。 (右上隅のサイズは他のものとは異なるようです。)
他のヒント
スプライトを描画するだけの場合、JavaのGraphicsクラスには drawImage 画像の特定の領域を引き出すメソッド。ソース画像を指定する必要があります。グラフィックスオブジェクトにスプライトを描画する場所(x、y、幅、高さ)、およびスプライトが配置されている画像のフレーム(x、y、幅、高さ) 。
スプライトの幅と高さが描画領域に描画する幅と高さと同じであると仮定すると、次のようにスプライトフレームを描画する独自のメソッドを定義できます
void drawSpriteFrame(Image source, Graphics2D g2d, int x, int y,
int columns, int frame, int width, int height)
{
int frameX = (frame % columns) * width;
int frameY = (frame / columns) * height;
g2d.drawImage(source, x, y, x+width, y+height,
frameX, frameY, frameX+width, frameY+height, this);
}
columns
は、スプライトシートにある列の数です。メソッドの最初の2行は、シート内のスプライトフレームのx位置とy位置を計算します。
シート内の大きなスプライトには特別な処理が必要です。タイルを使用してそれらを描画することもできるため(この場合、各大きな画像に対して4つのスプライトを描画します)、それらのスプライトに使用するx、y、幅、高さを手動で把握することもできます。
スプライトシートが通常のシート(すべてのスプライトが同じサイズ)で、5 x 15のパターンで配置されている場合、次のメソッド呼び出しで20番目のフレームを描画します
Toolkit tk = Toolkit.getDefaultToolkit();
Image pacman = tk.getImage(getURL("pacman.png"));
...
drawFrame(pacman, g2d, x, y, 15, 19, 25, 25);
ここで、xとyはグラフィックスオブジェクトにスプライトを描画する位置、15はスプライトシートの列数、19はフレーム(番号付けは0から始まります)、25は幅で、各スプライトの高さ(概算)。