0

SpriteSheetの API を検索しましたが、さまざまなサイズのスプライトでスプライト シートを作成する方法については何も見つかりませんでした。

私が使用しているスプライト シートには、16x16px のタイルの行、その下の 24x24px のタイルの行、その下の 8x8px の行などがあります。

元々、Slick2D を使用せずに、BufferedImage.getSubimage() を使用して、スプライト シートの一時的な BufferedImage から各スプライトを取得しました。ここで使用できる同様の方法はありますか?

4

2 に答える 2

1

少なくともこの記事を書いている時点では、現在のバージョンの API で直接サブイメージを作成する方法はないと思います。

ただし、私が考えることができる3つの可能なオプションがあります(上記のメソッド呼び出しを自分で追加するオプションに加えて-結局のところオープンソースです):

  1. 本当に同じソース ファイルに保持したい場合は、スプライト サイズごとに 1 つずつSpriteSheet、同じソースから複数のオブジェクトをインスタンス化できます。Image
  2. このImageインスタンスを呼び出して、各サイズ (24x24、16x16 など) ごとに 1 つずつ、3 つの画像getSubImageに分割することができます。Image次に、それらのサブイメージからインスタンス化しますSpriteSheets
  3. サイズに基づいて、ソース ファイルを個別のファイルに分割できます。つまり、24x24 のスプライト セルを 1 つのファイルに、16x16 のスプライト セルを別のファイルに、というようにします。
于 2012-02-24T14:38:18.993 に答える
0

Image を保持し、Graphics オブジェクトの drawImage メソッドのオーバーロードを使用して、画像のどの部分をどこに描画するかを指定できます。

g.drawImage(image, x1, y1, x2, y2, srcX1, srcY1, srcX2, srcY2);

[javadoc](http://slick.cokeandcode.com/javadoc/org/newdawn/slick/Graphics.html#drawImage(org.newdawn.slick.Image, float, float, float, float, float, float, float を参照) 、 浮く))

最初のパラメーターは、イメージのインスタンスです。次の 2 つのパラメーターは、レンダリングが開始される画面上のポイントを定義します。X2 と y2 は、レンダリングの終点を定義します。通常、x2 は x1 + spriteWidth で、y2 は y1 + spriteHeight ですが、これらの値を変更して、スプライトを異なるサイズで描画できます。最後の 4 つのパラメーターは同じように機能しますが、画面に描画されるスプライト シートの領域を定義します。

あなたの例を取り上げて、3 番目の行から 2 番目のタイルを描画したい場合、呼び出しは次のようになります。

int tileWidth = 8;
int tileHeight = 8;
int sourceX = 40;
int sourceY = 8; //as its the sec
int drawX = 34;
int drawY = 65;
g.drawImage(image, drawX, drawY, drawX + tileWidth, drawY + tileHeight
    , sourceX, sourceY, sourceX + tileWidth, sourceY + tileHeight);

スプライト シートを使用する場合、一部 (非常にまれなケース、主にテスト) でハードコーディングされた値と、ソース x1、x2、y1、および y2 値が格納されているスプライト クラスがあります。それらの束をリストまたはマップにパックして、スプライト インデックスを作成することができます。通常、何らかの方法で定義を生成してからリストをシリアル化するので、必要に応じてそのリストを簡単にリロードできます。

これは私の XML 定義の短い例です (xml には x2 と y2 の値ではなく幅と高さを保存します。これは、人間が読みやすく、手動で編集する方が便利だからです。逆シリアル化の後、x2 と y1 の値を計算します。 ):

<spriteSheet imageName="buildings" name="buildings">
  <sprite name="1x2 industry 01" spriteX="0" spriteY="0" width="50" height="112"/>
  <sprite name="1x2 quarters 01" spriteX="50" spriteY="0" width="50" height="112"/>
  <sprite name="1x1 spaceport 01" spriteX="243" spriteY="112" width="51" height="56"/>
      ...
</spriteSheet>
于 2012-07-17T23:16:39.620 に答える