2009-03-07 13 views

答えて

46

スプライト領域がBufferedImageに読み込まれた場合、getSubimageメソッドを使用して、スプライトシートのサブイメージを取得できます。

getSubimage方法は、所望のサブイメージのxy、及びwidthheightを取るので、所望のスプライトを得ることができます。ほとんどのスプライトは同じサイズであるように見えるので、大部分の画像を繰り返し処理するためにループのネストされたforループによってそれらのほとんどを取り出すことができると思います。

たとえば、ImageIOクラス(たとえばreadメソッド)を使用してスプライトイメージがロードされ、各スプライトのサイズが10ピクセル×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 
     ); 
    } 
} 

はキャッチがすべてのスプライトが同じサイズであれば、当然のことながら、上記のコードはのみ動作しますが、そのために働くために行われ、いくつかの調整をすることが必要となります

指定されたスプライトシート。

+0

いくつかのコードをお願いしますか? –

+0

申し訳ありませんが、私は誤ってポストアンサーボタンを押しました。私は答えにもっと追加します。 – coobird

+1

* i *と* j *インデックスは* getSubImage()*コールでスワップする必要があります。 –

12

スプライトを描画したいだけならば、JavaのGraphicsクラスにはdrawImageメソッドがあり、画像の特定の領域を引き出します。君は。 Graphicsオブジェクト(x、y、width、height)にスプライトを描画したい場所と、スプライトがどのフレームのフレームにあるか(x、y、width、height)を指定する必要があります。 。幅とスプライトの高さを想定し

は、あなたが描画領域に描画する同じ幅と高さ

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位置を計算します。

シートにある大きなスプライトには特別な処理が必要です。これらのスプライトに使用するx、y、幅、および高さを手動で把握することができます(この場合、大きな画像ごとに4つのスプライトを描画します)。

あなたのスプライトシートは、通常のシート(すべてが同じサイズをスプライト)であり、それはあなたがあるとして、あなたは以下のメソッド呼び出し

Toolkit tk = Toolkit.getDefaultToolkit();  
Image pacman = tk.getImage(getURL("pacman.png")); 
... 
drawFrame(pacman, g2d, x, y, 15, 19, 25, 25); 
と20フレームを引く5×15パターンに配置された場合

ここで、xとyはGraphicsオブジェクトにスプライトを描画する位置、15はスプライトシートの列数、19はフレーム番号(0から始まる番号)、25は幅と高さです。各スプライト(私は近似した)。