読者です 読者をやめる 読者になる 読者になる

俺とプログラミング

某IT企業でエンジニアをしてます。このブログではプログラミングに関わることを幅広く発信します。

【libGDX入門】アプリケーションの構造

Java 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に何が設定できるかは調べてみるといいかもしれません。 AndroidiOSの場合、AndroidManifestやInfo.plistの方の設定も要チェックです。

共有コード

それぞれのLauncherクラスを見ると、最後に必ずMyGdxGame()がアプリケーションに渡されていることが分かります。 このクラスが共有のメインロジックの処理を行うことになります。 初期状態では、ApplicationListenerを実装したApplicationAdapterクラスを継承しています。 ApplicationListenerには特に重要な下記の6つのメソッドが用意されています。 これらのメソッドがアプリケーションを形作ります。

メソッド 役割 呼ばれるタイミング
create() 初期化 アプリ生成時に1回だけ
render() 描画やメイン処理など 毎フレーム
pause() セーブデータの保存など ホームボタンが押された時
disposeが呼ばれる前
dispose() リソースの解放 アプリ終了時
resume() あまり使わない pauseから復帰する時
resize(int w, int h) リサイズ処理 画面サイズが変更した時
createのすぐ後に1回

以下はアプリケーションサイクルの図解です(公式から引用)。
https://github.com/libgdx/libgdx/wiki/images/70efff32-dd28-11e3-9fc4-1eb57143aee6.png

毎回呼ばれるメインロジックの処理は基本的には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については次回解説したいと思います。


Androidゲームプログラミング A to Z

Copyright © 2016 ttlg All Rights Reserved.