【libGDX入門】アプリケーションの構造
libGDXを利用する上で重要な、プロジェクトの構造と、メインとなるクラス及びメソッドを解説します。前回セットアップアプリ(gdx-setup.jar)で生成した最小限のコードを見ながら進めていきます。
初めに
生成されたliGDXプロジェクトの階層構造は主に以下のようになっています。
project/ build.gradle # gradleの設定ファイル gradlew # gradle実行スクリプト local.properties # Android SDKの場所 android/ AndroidManifest.xml # 設定ファイル(Androidアプリ) assets/ # 共有の画像や音楽ファイルなど badlogic.jpg src/ AndroidLauncher.java # Androidで初めに呼ばれるクラス res/ # アイコン画像など(Androidアプリ) ios/ Info.plist.xml # iOSアプリの設定ファイル src/ IOSLauncher.java # iOSで初めに呼ばれるクラス data/ # アイコン画像など(iOSアプリ) desktop/ src/ DesktopLauncher.java # Desktopで初めに呼ばれるクラス core/ src/ # 共有のコード MyGdxGame.java html/
この中で重要なのは、core/srcの部分です。 ここに、全プラットフォームで共有のロジックを書いていきます。
そして、android/assetsには、共有の画像や音楽ファイルを入れていきます。
Launcherクラス
各プラットフォームごとにLauncherクラスが用意されています。 プラットフォーム固有のコードはここに書くことになります。
まずDektopから確認していきます。長いのでインポート文は省略しています。
DesktopLauncher
public class DesktopLauncher { public static void main (String[] arg) { LwjglApplicationConfiguration config = new LwjglApplicationConfiguration(); new LwjglApplication(new MyGdxGame(), config); } }
デスクトップ初期画面サイズを変更する場合、ここで以下のように設定します。 スマートフォン向けのリリースを考えている場合、ターゲットとするスマホと同じアスペクト比にすると都合がいいと思います。
public class DesktopLauncher { public static void main (String[] arg) { LwjglApplicationConfiguration config = new LwjglApplicationConfiguration(); config.width = 750; config.height = 1334; new LwjglApplication(new MyGdxGame(), config); } }
AndroidLauncher
public class AndroidLauncher extends AndroidApplication { @Override protected void onCreate (Bundle savedInstanceState) { super.onCreate(savedInstanceState); AndroidApplicationConfiguration config = new AndroidApplicationConfiguration(); initialize(new MyGdxGame(), config); } }
IOSLauncher
public class IOSLauncher extends IOSApplication.Delegate { @Override protected IOSApplication createApplication() { IOSApplicationConfiguration config = new IOSApplicationConfiguration(); return new IOSApplication(new MyGdxGame(), config); } public static void main(String[] argv) { NSAutoreleasePool pool = new NSAutoreleasePool(); UIApplication.main(argv, null, IOSLauncher.class); pool.close(); } }
プラットフォーム固有の処理、例えばリーダーボードや広告などはこのLauncherクラスに書くことになると思います。 以下の公式の解説がわかりやすいです。
また、それぞれのconfigに何が設定できるかは調べてみるといいかもしれません。 AndroidやiOSの場合、AndroidManifestやInfo.plistの方の設定も要チェックです。
共有コード
それぞれのLauncherクラスを見ると、最後に必ずMyGdxGame()がアプリケーションに渡されていることが分かります。 このクラスが共有のメインロジックの処理を行うことになります。 初期状態では、ApplicationListenerを実装したApplicationAdapterクラスを継承しています。 ApplicationListenerには特に重要な下記の6つのメソッドが用意されています。 これらのメソッドがアプリケーションを形作ります。
メソッド名 | 役割 | 呼ばれるタイミング |
---|---|---|
create() | 初期化 | アプリ生成時に1回だけ |
render() | 描画やメイン処理など | 毎フレーム |
pause() | セーブデータの保存など | ホームボタンが押された時 disposeが呼ばれる前 |
dispose() | リソースの解放 | アプリ終了時 |
resume() | あまり使わない | pauseから復帰する時 |
resize(int w, int h) | リサイズ処理 | 画面サイズが変更した時 createのすぐ後に1回 |
毎回呼ばれるメインロジックの処理は基本的にはrender()メソッドで書くことになります。
MyGdxGame
public class MyGdxGame extends ApplicationAdapter { SpriteBatch batch; Texture img; @Override public void create () { batch = new SpriteBatch(); img = new Texture("badlogic.jpg"); } @Override public void render () { Gdx.gl.glClearColor(1, 0, 0, 1); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); batch.begin(); batch.draw(img, 0, 0); batch.end(); } }
さて、MyGdxGameがなにをやっているか、もうお分かりですね。 createでリソースの初期化処理を行い、renderで描画処理を行っています。SpriteBatchについては次回解説したいと思います。