Android
Windows
libGDX

libGDXでプラットフォーム独自の機能を呼び出す

More than 3 years have passed since last update.

 libGDXはマルチプラットフォーム対応なので、ツールでプロジェクトを生成すると、各プラットフォーム向けのプロジェクトと共通プロジェクト(Core)が生成されます。
 通常は、共通プロジェクトのみを編集し、各プラットフォーム向けのプロジェクトでビルドするだけでOKです。

 しかしプラットフォーム独自の機能を利用する場合は、各プラットフォーム側のコードを変更する必要があります。
 アプリ起動時のみの処理であれば特に問題はありませんが、アプリ実行中(Coreでの処理中)に各プラットフォーム毎のコードを呼び出す場合は一工夫必要です。
 この方法について解説します。

想定される用途

・広告SDKの呼び出し
・アプリ内課金処理の呼び出し
・libGDXが対応していないセンサー値の取得

など

作成内容

 画面をタッチすると各プラットフォームネイティブのメッセージダイアログを表示します。

 Core側からタイトルと本文を指定して呼び出すと、その内容でダイアログを開きます。
 [OK]ボタンを押すと閉じます。

 今回は、Android版とデスクトップ版で作成しました。
 

方針

 メッセージ表示処理のinterface MessageBoxShowable を定義し、これを実装したクラスのインスタンスをCore側のコンストラクタで受け取るにします。
 画面がタッチされたらこのインスタンスのメソッドを呼び出してメッセージダイアログを表示します。(この処理は各プラットフォーム側に記述します)

1. メッセージ表示処理のinterface MessageBoxShowable を定義します。
2. Core側のクラス MyGdxGame に、MessageBoxShowableを実装したクラスのインスタンスをパラメータとして受け取るコンストラクタを追加します。
2-1. コンストラクタでは受け取ったインスタンスを保存
2-2. MessageBoxShowable を渡されない場合のためデフォルトコンストラクタも追加します。
3. 各プラットフォーム側のコードでは、MessageBoxShowableを実装したクラスを作成します。
3-1. クラスでは、showMessageBox メソッドにメッセージダイアログ表示コードを記述します。
3-1. MyGdxGameの生成時にパラメータとして渡します。
4. Core側のクラスで、画面タッチ時に、MessageBoxShowableshowMessageBox メソッドをコールします。

作成

プロジェクトは、libGDX 1.0以降でのプロジェクト作成方法(Gradle+Eclipse)の記事で作成したものを使用します。

インターフェース

Coreにインターフェースを定義
メッセージダイアログ表示用のMessageBoxShowableメソッドを持ちます。

MessageBoxShowable.java
package com.dokokano.gdxappwithseveralmsgbox;

public interface MessageBoxShowable {
    public void showMessageBox(String title,String message);
}

Coreコード

GdxAppWithSeveralMsgBox-core プロジェクト
共通のコードです。

MyGdxGame.java
package com.dokokano.gdxappwithseveralmsgbox;

import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;

public class MyGdxGame extends ApplicationAdapter {
    SpriteBatch batch;
    Texture img;

    MessageBoxShowable messageBoxShowable_;

    public MyGdxGame()
    {
        messageBoxShowable_ = null;
    }
    public MyGdxGame(MessageBoxShowable messageBoxShowable) {
        messageBoxShowable_ = messageBoxShowable;
    }

    @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();

        if ( Gdx.input.justTouched() ) {
            if ( messageBoxShowable_!=null) {
                messageBoxShowable_.showMessageBox("ShowMessageBox", "Hello GDX!");
            }
        }
    }
}

コンストラクタ

MessageBoxShowableを実装したクラスのインスタンスをパラメータとして受け取るコンストラクタを追加します。
コンストラクタでは受け取ったインスタンスをmessageBoxShowable_に保持

    MessageBoxShowable messageBoxShowable_;

    public MyGdxGame()
    {
        messageBoxShowable_ = null;
    }
    public MyGdxGame(MessageBoxShowable messageBoxShowable) {
        messageBoxShowable_ = messageBoxShowable;
    }

 メッセージダイアログ表示呼び出し

画面タッチ時に、メッセージダイアログ表示メソッドを呼び出しています。
※ インスタンスが登録されていない場合はnullチェックして呼び出さない。
java
if ( Gdx.input.justTouched() ) {
if ( messageBoxShowable_!=null) {
messageBoxShowable_.showMessageBox("ShowMessageBox", "Hello GDX!");
}
}

Android版のコード

GdxAppWithSeveralMsgBox-Android プロジェクト

AndroidLauncher.java
package com.dokokano.gdxappwithseveralmsgbox.android;

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.Handler;

import com.badlogic.gdx.backends.android.AndroidApplication;
import com.badlogic.gdx.backends.android.AndroidApplicationConfiguration;
import com.dokokano.gdxappwithseveralmsgbox.MessageBoxShowable;
import com.dokokano.gdxappwithseveralmsgbox.MyGdxGame;

public class AndroidLauncher extends AndroidApplication {
    Handler handler_ = new Handler();

    @Override
    protected void onCreate (Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();
        initialize(new MyGdxGame( new MessageBoxShower() ), config);
    }

    class MessageBoxShower implements MessageBoxShowable {
        @Override
        public void showMessageBox(final String title, final String message) {
            handler_.post(new Runnable() {

                @Override
                public void run() {
                    AlertDialog.Builder alertDialog=new AlertDialog.Builder(AndroidLauncher.this);
                    alertDialog.setTitle(title);
                    alertDialog.setMessage(message);
                    alertDialog.setPositiveButton("OK",new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog,int whichButton) {
                            setResult(RESULT_OK);
                        }
                    });
                    alertDialog.create();
                    alertDialog.show();
                }
            });
        }
    }
}

 MessageBoxShower クラスを定義しており、共通クラスのMyGDXGame生成時にインスタンスをパラメーターとして渡しています。
 ダイアログ表示にはAlertDialogを利用しています。
 Coreの処理から呼び出された場合は、UIスレッドではないのでHandlerを使用して実行しています。

実行画面

Screenshot_2014-05-07-16-32-33.png

Androidネイティブのダイアログが表示されるのがわかります。

 

Desktop版(Windows/OS X等)のコード

GdxAppWithSeveralMsgBox-Desktop プロジェクト

DesktopLauncher.java
package com.dokokano.gdxappwithseveralmsgbox.desktop;

import org.lwjgl.Sys;

import com.badlogic.gdx.backends.lwjgl.LwjglApplication;
import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration;
import com.dokokano.gdxappwithseveralmsgbox.MessageBoxShowable;
import com.dokokano.gdxappwithseveralmsgbox.MyGdxGame;

public class DesktopLauncher {
    public static void main (String[] arg) {
        LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();
        new LwjglApplication(new MyGdxGame( new MessageBoxShower() ), config);
    }

    static class MessageBoxShower implements MessageBoxShowable {
        @Override
        public void showMessageBox(String title, String message) {
            Sys.alert(title, message);
        }
    }
}

 MessageBoxShower クラスを定義しており、共通クラスのMyGDXGame生成時にインスタンスをパラメーターとして渡しています。
 ダイアログ表示には、Desktop版のバックエンドであるlwjglのSysクラスのalertメソッドを利用しています。

実行画面 ※ Windowsで実行

スクリーンショット 2014-05-07 16.12.29.png

↓(クリックすると)

スクリーンショット 2014-05-07 16.21.10.png

Windowsネイティブのダイアログが表示されるのがわかります。

実行画面 ※ OS Xで実行

スクリーンショット 2014-05-08 10.24.59.png

OS Xネイティブのダイアログが表示されるのがわかります。

その他のプラットフォームで実行した場合

今回は実装していないので、タッチしてもなにもおこりません。
※ コンストラクタで渡していないのでインスタンスがnull。
このように特定のプラットフォームのみに対応した機能を実装することが出来ます。