AndroidもScalaで書きたい!という衝動に身を任せ、パズルゲームを作ってみました。
公開中のゲームはこちらです。
4方向にフィールドのあるパズルゲームです。ブロックを積んで消していく風のやつですね。
コア部分のコードはこちらです。
これまで、ブラウザで動くscala-js版や、ターミナル上で動くscala-native版を作っていたのですが、満を持してAndroid版に挑戦した次第です。
今回は、とりあえずリリースまで出来たということで、セットアップやScalaで書く上での実装方針など、軽く触れたいと思います。
モチベーション
- Scalaの資産を活用してAndroidアプリを作りたい
- Androidアプリをリリースして、知見を得たり、実験をしたい
前者は完全な趣味の領域です。Scalaでなんでも書きたい欲を満たしたいだけです。
後者は、お仕事でAndroidを触る中で、色々と試してみたいことがあるけれど、さすがにお仕事のプロジェクトで実験するわけにもいかず、ならば自分でアプリをリリースしてまえ、というノリです。
今回、初めて自分のアプリをリリースしましたが、イチから自分でやってみるとやはり違いますね。今まで曖昧だった知識がスッと理解できたりします。
libGDXについて
libGDXは、オープンソースのクロスプラットフォームのゲーム開発フレームワークです。Javaで書かれているので、JVM言語でJavaとの相互運用が可能あれば、任意の言語で書くことができます。
デスクトップ/Android/iOS/HTML5に対応していますが、HTML5で動かすにはGWT経由となり、Javaで書く必要があります。また、iOS向けにはMOSを使うらしいのですが、試したことがないので詳細は分かりません...。
※2019.10.22追記 - iOS向けにはRoboVMの選択肢もあるということをコメントで教えていただきました。
非公式ですが、ドキュメントの翻訳も公開されています。
セットアップ
libGDXでは、専用のセットアップツールが用意されていて、簡単にプロジェクトの雛形を作ってくれます。
詳細は公式のドキュメントを見ていただければと思います。
Sub Projects
では生成するプロジェクトを選択できます。今回はAndroid版を作りたかったのと、検証用にデスクトップ版を生成しました。
ビルドツールはgradleです。
ここにScala用のプラグインを入れることでScalaのビルドに対応しました。
また、使用するScalaのバージョンは2.11にしています。2.12でビルドすると、実行時に互換がなく落ちてしまいました。Scala 2.12はJava8を要求しますが、Android側の互換がないということかと思います。
詳しくはドキュメントも参照してみてください。
sbt経由のアプローチもあるにはありますが、プラグインがメンテナンスされていないようで不安があり、採用しませんでした。
コーディングについて
コードはScalaで書けますが、もちろんJavaや、その他のJVM言語でも書けます。
Scalaは2.11なので、ちょこちょこと不便なところが出て来ますが、今回のベースとなったコードが元々2.11向けだった(scala-nativeサポートのため) ので、その点は楽でした。
libGDXでは、マルチプラットフォーム間で共有するcoreプロジェクトと、それぞれのプラットフォーム向けのプロジェクトがあります。
基本となるアプリケーションコードはほぼcoreに書けますが、プラットフォーム固有の処理はそれぞれのプロジェクト側に書きます。
Android固有の特殊なことがしたい場合はココをいじることになります。
libGDXは何をしているのか?
libGDXの主たる責務は、プラットフォーム間の差異を抽象化して共通のインターフェースを開発者に提供しすることです。
描画、イベントハンドリング、オーディオ、ネットワークアクセスなどをカバーしています。
描画に関しては、OpenGLをベースとしています。開発者は基本的にはテクスチャを座標指定で描画し、それをlibGDXがOpenGLを介してレンダリングします。
Androidにおいては、これをAndroidGraphicsクラス経由で行っています。このクラスはViewを提供するので、このViewをレイアウトすることで、Androidアプリとしての描画が実現されています。
[このドキュメント] (http://westplain.sakuraweb.com/translate/libGDX/Third%2520Party%2520Services/Admob%2520in%2520libgdx.cgi) は広告を埋め込む話ですが、この辺りに触れています。
つまるところ、ただのViewなので、ActivityやFragmentと組み合わせて使うことができます。
逆に、libGDXだけで完結する場合、ActivityやFragmentを意識することはほぼありません。
よしなにハイブリットにすることで、互いの弱点を補ったアプリを作ることも簡単です。
あとがき
Scalaで書いたAndroidアプリのリリースまで漕ぎ着けたので、簡単にご紹介しました。
Scalaで書ける、というのはやはり強みです。
願わくば2.11の縛りを突破したいですが・・・。
アプリとしては、まだまだ不完全ですが、今後、色々と実験がてら拡張していこうと思います。