libGDXとはWindows、Linux、Mac、Android、iPhone、HTMLに対応したクロスプラットフォームゲームライブラリです。有名なIngressでも利用されています。欧米ではわりとメジャーどころです。
#リソースを管理するのは大変
今まではリソースについてコンストラクタ等で生成するときに引数に文字列やFileHandleを渡せばよいという感じでした。
たとえばテクスチャ読み込みは以下のように
Texture tex = new Texture("hoge.png");
サウンド(効果音)読み込みは
Sound sound = Gdx.audio.newSound(Gdx.files.internal("hoge.wav"));
といった感じです。
もちろん、これでも問題はないのですが、規模が大きくなるとリソースが複数カ所で必要になった場合ちゃんと解放ができるかどうか、すでに読み込んでいる場合は読み込まないようにするとか、非同期で読み込めないとかいろいろと問題が出てくると思います。
そこで使われるのがAssetManagerです。
#AssetManagerとは
AssetManagerはリファレンスカウンタ方式というものを取っています。どれだけリソースを参照しているかをカウントするのです。
利用するときには参照カウンタを+1し、ロードします。すでに1以上になっていた場合はロードせず以前ロードした時の参照を返します。
もう使わなくなった時には参照カウンタを-1します。このとき参照カウンタが0になったら破棄されます。
これによって、複雑な画面の呼び出し順序などを考慮せず安全に確保と開放ができるようになります。
#使い方
まず普通にインスタンスを作って
AssetManager assetManager = new AssetManager();
ロードの指示をして(ここでリファレンスカウンタ+1)
assetManager.load("hoge.png", Texture.class);
取得。getメソッドはそこまで軽くはないのでループの中とかででは呼ばないように。
batch.begin();
Texture tex = assetManager.get("hoge.png");
batch.draw(tex, 0, 0);
batch.end();
解放(ここでリファレンスカウンタ-1)
assetManager.unload("hoge.png");
ただし、注意点があります。loadはあくまでもロード開始の指示をするだけです。非同期でロードされます。
とりあえず手っ取り早いロードするまでブロックする命令があります。
assetManager.finishLoading();
しかし、これではロードする項目が多いと画面も更新されないので長時間かかる場合は利用しないほうがよいでしょう。
ロードが完了したかどうかは以下のメソッドで調べることができます。
boolean isLoaded = assetManager.update();
読み込み中にアニメーション表示などをする場合はこちらを利用します。