2016-03-20 13 views
1

私は960x960のスプライトシートを私のLibgdxアンドロイド資産の内側にpngとして保存しています。私がゲームで使うためにスプライトを初期化することを指定したクラスでは、スプライトシートから120x120のスプライトを切り捨てるようにしようとしています(したがって、配列内に64個のアイテムがあるはずです)。どのように私はこれを行うことができますか?これは私が似たような状況にしようとしたものです:スプライトシートのスプライトを配列Libgdx

public static Texture spritesheet; 
public static Sprite[] textures = new Sprite[64]; 
... 
    //inside method that gets called once to initialize variables 
    spritesheet = new Texture(
      Gdx.app.getType() == Application.ApplicationType.Android ? 
        "...Spritesheet.png" : 
        "android/assets/...Spritesheet.png" 
    ); 
    spritesheet.setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.Linear); 

    for (int x = 0; x < 64; x ++) { 
     textures[x] = new Sprite(spritesheet, x, (x%8), 64, 64); 
     textures[x].flip(false, true); 
    } 

私は、これを他のクラスでスプライトを描画:私はこれを行うと、それは本当に奇妙な行為

batch.draw(Assets.textures[0 /*this can be any number*/], (float) x, (float) y, 108, 108); 

。配列に要素が入っていると言われていますが、Array Index Out of Bounds Exceptionsが残っているか、スプライトが狂っているだけです。全体的に、それはうまくいかない。私がやろうとしているのは、64種類のスプライトを別々に初期化する必要がないので、スプライトのレンダリング時に入力されたインデックスを変更してスプライトを簡単に変更できるようにするためです。アニメーションのように。これをやり遂げるにはどうすればいいですか?

答えて

0

私はあなたのループがこの

for(int x = 0; x < 64; x ++){ 
    textures[x] = new Sprite(
     spritesheet, 
     (x%8)*64, //where x=3, (3%8)*64 = 3*64 = 192px sourceX 
     (x/8)*64, //where x=3, (int)(3/8)*64 = 0*64 = 0px sourceY 
     64, //source width 
     64 //source height 
    ); 


Another test case where x=20; 
(20%8)*64 = 4*64 = 256px SourceX 
(20/8)*64 = 2*64 = 128px SourceY 
3

ようになっているはずのためにあなたは、この目的のためにTextureAtlasを使うべきだと思います。アトラスは、LibGDX TexturePackerによって別々のイメージから自動的に生成されるファイルです。あなたのシート内の画像境界からNinePatch情報まですべてを保存します。別々のイメージをフォルダに入れ、そのフォルダでTexturePackerを実行するだけです。これは簡単にロードできるシートと.atlas/.packファイルを作成します。

コマンドラインに問題がある場合はTexturePackerGuiが存在しますが、コマンドラインをお勧めします。また、アプリ内で使用することもできます。

私が通常行っていることは、開発中にこれらのシートをオンザフライで作成することです。私は簡単に別の画像を上書きすることができ、私は再び私のアプリを実行した後にすぐに効果があります。プロジェクトのルートに新しいフォルダimagesを作成します。その後、各パックごとに別のフォルダを作成する必要があります。この例では、imagestilesetというフォルダを作成します。 DesktopLauncherでは、このフォルダを設定して画像からアトラスを作成します。

TexturePacker.Settings settings = new TexturePacker.Settings(); 
    settings.maxWidth = 1024; 
    settings.maxHeight = 1024; 

設定ファイルには、あなたのアトラスに関するすべてが指定されています。イメージ、パディング、回転などから透明度を取り除く必要がある場合は、単一のシートの最大サイズです。これらはすべて非常に簡単で、これらのすべてをドキュメントで見ることができます。これらの設定を使用して、アトラスを作成することができます。

TexturePacker.process(settings, 
      "../../images/tileset", //where to find the images to be packed. 
      "../../android/assets/tileset/", //where to store the atlas and sheet 
      "tileset"); //what filename to use 

これで、.atlasファイルを開くことができます。ファイル名をエイリアスとして使用することができます。このエイリアスはそれらを検索するために使用されますが、まずアトラスを読み込みます。それが今度はandroid/assets/ではデフォルトでは、あなたのローカルパスではデフォルトで見えコンストラクタに単なる文字列を渡すことで

TextureAtlas atlas = new TextureAtlas("tileset/tileset.atlas"); 

。今、アトラスにシート内の資産を引き渡すよう依頼することができます。

atlas.findRegion( "alias"); // "エイリアス"という名前のシートに画像を渡します

このようなテクスチャを検索するのはやや高価です。このように多くのテクスチャを検索したくないので、まだどこかに保存する必要があります。

あなたがimage_01.pngimage_02.pngimage_03.pngのようなあなたのイメージシーケンスに名前を付ける場合は、同じ名前の下にそれらをすべて保存し、アトラス内では、彼らはそれがindexだ府ソートします。ですから、特定のテクスチャの別々の配列をしたい場合は、_xxでそれらに名前を付け、一度にそれらのすべてを取得することができます:

atlas.findRegions("alias"); 

これはAnimationのために特に便利です。画像シーケンスをフォルダにコピーし、パックするように指定するだけです。シーケンスの名前を正しく指定し、リージョンをアニメーションに指定します。すべてがバットからすぐに機能します。あなたはそれがTextureAtlas.classからだ指定することになり除いAssetManagerTextureAtlasをロード

はかなり正常なTextureと同じです。あなたは常に画像を扱う.atlasをロードします。

私は常に資産を読み込むためにAssetDescriptorを使用します。あなたがどこにいたら私は静的なものを取り除くだろうAssets.textures[]since that will get you into trouble sooner or later

//None static AssetManager with getter 
private AssetManager manager = new AssetManager(); 
public AssetManager getManager() { return manager; } 

//Specify a descriptor for the atlas, this is static so I can acces it anywhere. 
//It's just a descriptor of the asset so this is safe. 
public static final AssetDescriptor<TextureAtlas> TileSet = new AssetDescriptor<TextureAtlas>("tileset/tileset.atlas", TextureAtlas.class); 

//then just load everything 
public void load() 
{ 
    manager.load(tileSet); 
    //... load other stuff 
} 

今、ちょうどあなたがあなたの資産へのアクセスを必要とし、あなただけそうのような任意の資産をロードすることができますどこにでもAssetManagerオブジェクトを渡す:

TextureAtlas tileset = assetManager.get(Assets.TileSet); 
+0

テクスチャアトラスは、スケールのための良いアイデアですが、それはまだに重要ですそれがどのように機能するか知っているいいぞ。 –

関連する問題