Help us understand the problem. What is going on with this article?

Scala + libGDXで、Androidアプリをリリースしてみた

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アプリとしての描画が実現されています。
このドキュメント は広告を埋め込む話ですが、この辺りに触れています。

つまるところ、ただのViewなので、ActivityやFragmentと組み合わせて使うことができます。
逆に、libGDXだけで完結する場合、ActivityやFragmentを意識することはほぼありません。

よしなにハイブリットにすることで、互いの弱点を補ったアプリを作ることも簡単です。

あとがき

Scalaで書いたAndroidアプリのリリースまで漕ぎ着けたので、簡単にご紹介しました。

Scalaで書ける、というのはやはり強みです。
願わくば2.11の縛りを突破したいですが・・・。

アプリとしては、まだまだ不完全ですが、今後、色々と実験がてら拡張していこうと思います。

yuiwai
Scala/DDD/AWSが好きなおじさんです。 長らくソシャゲのサーバサイドを作ってきたので、ゲームのドメインの知識が少しあります。 趣味のブログ https://yuiwai.hatenablog.com/
https://yuiwai.hatenablog.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした