2Dゲームエンジンが7-8年前に比べて大分落ち着いてきたようで、クロスプラットフォームでの開発もスタンダードになってきたようです。いまはおそらくUnityがメジャーどころではないでしょうか?ただ、ゲームをつくるとなると無料版だと実行時のUnityという初期画面が消せない制限があるし、いきなり有料化される可能性もあるのでちょっと怖いです(IFTTTの件もあったのでw)。
そんな中、みつけたのがlibGDX
このライブラリはなんとJava(とKotlin)で記述ができるのです。
もう新しく言語おぼえるのも飽きたよ・・・
という私にはピッタリ。あとクロスプラットフォームで開発できるとのこと。海外では結構メジャーみたい。とりあえず、触ってみないと始まらないので導入までの経過を忘備録的に書いておきます。まずはAndroidで開発なのでWindowsに導入しました。思ったより簡単に導入できます。
環境
- Windows 10
- Androio Studio 4.0.1
- LibGDX 1.9.10
Android StudioのセットアップとAVD(シミュレーター)のセットアップは割愛します。
JAVA SDKのインストール
libGDXで使うバージョンが曲者です。JDK SE 8がおすすめです。最新版(JDK SE 15)では動きませんでした。プロジェクトの生成でBUILD FAILEDが出ます。JDK SE 11でもうまくいくとの報告があった気もしますが、8が無難そうです。
ちなみにOracleにアカウント登録しないと旧バージョンはDLできませんので登録しましょう。
Android Studioで開く
[開く]から、生成されたフォルダの中にあるbuild.gragleを選べば開きます。ビルドが走ってアップデートを求められますのでアップデートします。ビルドが無事通ればAVDを起動して、すぐに実行することができました。
libGDXの自分なりの使い方は、いま勉強中です(最後にちょろっと書きますけど)。プロジェクトのアプリ名、アプリケーションID、アイコンの設定をまず変えます。
アプリ名の変更
[res]-[values]-[strings.xml]のapp_nameを変更します。ローカライズしたい場合はローカライズしたxmlを加えます。最近ではtranslation editorなるものがあって便利ですね。画像ではゲームないのローカライズ設定も入ってますが、ゲーム内でのローカライズはLibGdx用にローカライズ方法が用意されてますのでそっちを使うのでアプリ名以外は消してOKと思います。
アプリケーションIDの変更
build.gradle(Module:android)にあるdefaultConfigのapplicatiobIDを変更すればOKです。
アイコンの変更
まず、
Image Assetでアイコンアイコンを作ります。この辺のサイトで紹介されているので参考にします
各クラスの実装
LibGdx(Androidアプリ)の場合
- AndroidLauncher(AndroidApplicationを継承したActivityみたいなもの)のロード
- Gameクラスのロード
- Screenクラスのロード
の順番でロードされます。1はプラットフォーム由来の機能の実装、2-3にはLibGDXがらみの機能の実装をするようにします。
1で実装する機能として考えられるのは
- 広告Admobなどの実装
- TTSの実装
- 端末のボリュームなどのコントロール機能
などです。ActivityやContextにアクセスするような機能がここに入ると思います。
基本的に2のGameクラスは1アプリで1つしか生成しませんので、ゲームの全体にわたって管理する機能を実装します
- リソースのロード
- ベースフォント
- BGMの管理
- 1のランチャーとのやり取りするハンドラー管理
- 画面のセンターに表示するような汎用関数
などと思います。3に関してはプログラマ側の自由とおもいますが、私はScreen共通の機能を実装したサブクラスBaseScreenAdapterクラスをつくり、各ScreenをBaseScreenAdapterから継承して作っています。BaseScreenAdapterには主に以下の機能を実装しています。また
- ステージの管理(アスペクト比・塗りつぶしなど)
- バックキーの管理(Android)
- タッチの無効有効
- スクリーン全体のフェードイン・フェードアウト
- 簡易ダイアログ機能
- Gameクラスのインスタンスの保持
Scene2Dをメインでいく前提です。render()などは直で触ることは少ないですし、cocos2dやSpritekitライクにコーディングできます。
余談ですが、BGMの管理はScreenで行ってもいいですが、Screen切り替わりの時などインスタンスの破棄と生成が切り替わるタイミングを考えるとGameクラスで実装したほうが便利ですね。具体的なコードについてはもう少し煮詰めて別記事にて書きたいと思います
libgdxを使うにあたって上のサイトからとても学ばせてもらいました。感謝です。
クロスプラットフォーム
一応iOSでもビルトで来たんですけどどうもRovo-VM iOSとの連携がうまくいかずよくわからずじまいでした。シミュレーターに強敵的に転送して実行はできるようです。
この辺を参考にしては見ましたがうまくいかず頓挫中です。わかり次第別記事にしたいと思います。また、Mac自体もM1プロセッサへの移行時期でXcodeの改変や、AndroidStudioの動作(Rosseta経由なのかな?)が不明確なので様子見てます。もうSwift勉強しなおしてSpriteKitを使おうと思ってますけど・・・
まぁAndroid専用にしても良いライブラリだということにに変わりはありません。