libgdxを触り始めてまあまあ慣れてきたので一つ記事にしたいと思います。
Labelを生成するときには
1 2 3 4 5 6 7 8 |
FreeTypeFontGenerator.FreeTypeFontParameter parameter = new FreeTypeFontGenerator.FreeTypeFontParameter(); parameter.characters = "hogehoge"; parameter.size = 50; BitmapFont label_font = game.font_gen.generateFont(parameter); Label.LabelStyle labelStyle = new Label.LabelStyle(label_font, Color.WHITE); Label title = new Label("hogehoge", labelStyle); |
上のようなコードで生成します。いきなりgameとか出てきてイミフなのでざっくり説明すると
Androidアプリの場合
- AndroidLauncher(AndroidApplicationを継承したActivityみたいなもの)のロード
- Gameクラスのロード
- Screenクラスのロード
の順でロードされていきます。
マルチプラットフォームで作るとき、1はプラットフォームで変わるので、プラットフォームに依存しないように機能を実装する場合はGameクラス以降に実装する必要があります。またプラットフォームに依存しなければならない機能(TTSなど)は1に実装してインターフェイスに互換を持たせるなどの工夫が必要になります。
同じフォントを生成するのであればカスタムしたGameクラスやベースのScreenクラスで管理したほうがdispose忘れによるリークを防止できます。libgdxではttfなどのフォントファイルを直接扱うにはエクステンションが必要となるので、あらかじめ設定が必要です。具体的にはプロジェクト生成時のExtentionの設定でFreetypeにチェックを入れると使えるようになります。
後からでも追加できますが、bulid.gragleの修正が必要となります。下あたりが参考になります。
私は先に話した通りGameクラスに実装して管理しています
1 2 3 4 5 |
//共用フォントジェネレーター public FreeTypeFontGenerator mika_font_gen; //共用フォントジェネレータのインスタンス化 mika_font_gen = new FreeTypeFontGenerator(Gdx.files.internal(ResourceFileManager.MIKA_FONT)); |
1 2 3 4 5 6 |
@Override public void dispose() { super.dispose(); assetManager.dispose(); mika_font_gen.dispose(); } |
で、最初のLabelの生成に戻りますが、この標準のLabelはScaleを変更しても反映されません。
調べたところsetFontScaleで変更は可能ですが、Debug枠が正しく表示されないとか不都合があります。Groupを生成してそこにLabelを入れる方法はいいのですがその都度Groupを生成するのも面倒なのでMyLabelクラスを作り常用しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
public class MyLabel extends Group { private Label label; public MyLabel(String msg , Label.LabelStyle labelStyle) { super(); label = new Label(msg, labelStyle); this.addActor(label); } @Override public float getWidth() { return label.getWidth() * this.getScaleX() ; } @Override public float getHeight() { return label.getHeight() * this.getScaleY() ; } @Override public Actor debug() { return label.debug(); } @Override public boolean remove() { label.remove(); return super.remove(); } } |
getWidth()、getHeight()は正しい値を返すためにオーバーライドしています。これで一応、スケーラブルなラベルを生成することができるとおもいます。