2017/07/06

libgdx いじり

Google が提供している Java 版の Tango Examples は Rajawali をベースにしているため、自分が仕事で開発する Tango アプリも Rajawali ベースとしていましたが、最近は libGDX への移行を進めています。一応、要点については移行が済んだかな、と。

libGDX

libgdx/libgdx | GitHub

しばらく前には、Rajawali の品質が酷すぎるという事で、3D フレームワーク (エンジン) を自作しようと試みてもいましたが、あらためて 3D フレームワーク を調査していたら libGDX を見付け、そのクラス設計を眺めていたら非常に綺麗であったので、強く惹かれたという感じです。位置付け的には XNA Framework + α という印象ですね。

後は、調べてみると libGDX は Ingress で採用されているようでした。

IngressでもlibGDXが利用されているのをご存知でしたか? | Qiita

Ingress の後に登場した Pokemon GO は、Unity で実装されているとの情報を海外掲示板サイトなどで見かけましたが、libGDX でIngress を開発したという事例だけでも品質として心強いなぁと。

そこで、libGDX による Tango アプリ開発をネットで調べると・・・情報がほぼ無い。とは言え、Java による Android 開発の視点では、Tango もただの  Java ライブラリの 1 つでしかなく、OpenGL をベースに 1 つづつ考えればやれるだろうと考え、libGDX の基礎から始めていました。

でまぁ、やり始めると早いですね。libGDX 自体の情報は豊富ですから (ただし、英語)。

Android Studio 用プロジェクトは libGDX に付随のツールで行えるので、これをベースに Tango を加える事を考えるだけです。

libGDX 付随のツールが生成する Android Studio プロジェクトに含まれる build.gradle は、libGDX 式のフォルダ階層への対応や、不要な定義が含まれているため、一見では、複雑な事をしているかの如く見えます。
しかし、要点は、libGDX に含まれる JNI ライブラリへの依存関係を適切に記述し、apk ファイルに含まれるようにする定義のみです。build.gradle の内容を正確に理解すれば、わざわざツールでプロジェクトを生成せずとも、Android Studio で新規生成したプロジェクトに対して libGDX のための定義を加えるだけで済むことが分かります。
この辺りのサンプルは、時間があれば GitHub などで公開する・・・かもしれません。

後は、僕が対象としているアプリは Android 前提であるため・・・と言うか、現状では Tango の利用は Android が前提となるため、クロスプラットフォーム開発の概念は捨て、ネットワーク処理を始めとした非グラフィックス処理は AndroidApplication (libGDX の Activity) のサブクラスで行い、グラフィックス処理は ApplicationListener (libGDX のグラフィックス処理) で実装するように切り分けています。また、AndroidApplication サブクラスでは、ApplicationListener のロジックに関係するロジックのみを実装し、一般的な Android の画面を用いる場合には、別途、Activity を定義して startActivity などをするようにしています。

ただまぁ、ゲーム的なアプリを始めとした、GUI を自前でゴリゴリ書くような Tango アプリを開発するのであれば、Unity 版で開発するのが最善であろうかと思います。
Java では、GC 回避の手段がプーリングや作業用インスタンス変数などしかなく、それらはコードの可読性を極めて低下させ、くだらないバグを引き起こしやすいです。

しかしながら、Android 開発経験者の殆どは Java 開発であろうと思います。まずは Tango を使ってみたいという場合には、Java で書いてみるのが良い気がします。まずは、動く物を作って、自身のモチベーションを上げていく事が重要ですからね。

2017/02/17

すっかりスマホ ゲーム中心

ちょいちょい PS4 のゲームを遊んでいますが、ここ数年はゲームに割く時間の大半がスマホ ゲームです。

1 年以上プレイしているスマホ ゲームは、こんな感じです。
どれも積極的にプレイしているわけではないのですが、なんとなく続いています。

まぁ、スーパーガンダムロワイヤル以外は、そろそろアンインストール対象に入りかけています。僕はガンダム好きなので、モビルスーツを見ていると何となく嬉しいのと、非常にシンプルでありながらグラフィックスが好みなので、スーパーガンダムロワイヤルが気に入っています。他のガンダム ゲームも色々と試しましたが、続けられるのはスーパーガンダムロワイヤルだけですね。

1 年未満で最近遊んでいるのは、こんな感じです。
お気に入りは、アイドルモンスター、ウォーキング・デッド、サマナーズウォー、Brutal Age ですね。ゆる~い感じで遊びながらも成長や発展を感じられるものは好きです。

僕のスマホ ゲームのプレイ スタイルは、10 以上のゲームを並行させ、定期的に開催される時限イベントに合わせて、時間や気分次第でどれかをプレイするという物です。後は、全ゲームで 1 日 1 回のサインインを行い、デイリー報酬を貯めておく感じですね。まぁ、それを逃しても、長期的に見ると鼻糞レベルですから、それはそれでどうでも良いって感じです。

このスタイルでは特定のゲームに固執する事がなく、わざわざ課金アイテムを購入する気持ちが起こらないのですよね。このため、今まで無料枠でしかスマホ ゲームを遊んだことがありません。

後は、面白そうならとりあえずプレイし、僕の性格に合わなければ即アンインストールです。無料で始められますし、無理に楽しもうとしなくとも、それなりに新しいゲームを発見できますし。

即拒絶するのは、シナリオを見せたがる物や、アクション操作を主体とするゲームですね。短い時間で遊ぶスタイルが常となるスマホ ゲームでシナリオ重視とか意味不明ですし、スマホでアクション操作なども意味不明です。まぁ、面倒なスマホ ゲームは嫌いです。それらを体験したければ、据置機でゲームを買いますよ。

僕は、スマホ ゲームでは体験やゲーム性を求めておらず、なんとなくの成長や発展が進めば満足します。その感覚が常となったため、逆に、据置機には今まで以上に体験やゲーム性を求めるようになった気もします。
ゲーム性に応じて、「どの媒体で出すか?」ってことかな、と。PS4 のゲームでも「この感じならばスマホで出した方が儲かるのでは?」と感じる作がチラホラあります。

しかし、ゲームを延々と無料で遊べるなんて凄い時代ですよね・・・。

2017/02/15

Biohazard 7 やり始めて断念

Biohazard (バイオ) シリーズは初代しかやっていないのですが、初代はとてもインパクトがありましたね。まぁ、操作が面倒で直ぐに止めたのですが、攻略サイトを見て一応は攻略した記憶があります。それ以降は、ただの続編のイメージしか無く、また、徐々に単なる TPS 化しているように見えて手を付けていませんでした。

今回、バイオ 7 が出るにあたり、PV を見ると純粋に恐怖を見せる作りに見えたので、これは面白い!と思って購入しました。

・・・まぁ~怖い。僕はホラー映画への耐性があり、ホラーってコメディだろwww?と思う性格ですが、バイオ 7 は怖い。

それなりにゲーマであるせいか、敵との遭遇と対処を考えながら行動する思考が怖さを招くんですよね。「この状況で敵が出てきたらどうにもならない気がする」という思考のために、「歩くだけで怖い」という心理が働きます。
その心理をもたらすために、非常に狭い空間を舞台にしている感じがします。明らかに逃げ場がない、とか、対応できる武器が無い、と認識する状況に常に追いやられている感覚がします。何だか凄くヤバイとだけ認識できる状況と言うか。
また、敵に殺られたらそこで攻略を考えれば良いのですが、何度もリトライしたくないという心理もあり、慎重になります。

と、楽しんでいたのですが、わりと序盤で嫌になりました。まぁ、序盤のガレージでの戦闘ですが、「これは決められた攻略方法があるな」と感じたので、もうどうでもいいや、と。

正直、そういうのは面倒くさい。僕は怖さを体験し続けたいだけで、攻略を求めていないんですよね。ヌルゲーマ?そうです。僕には攻略よりも体験が重要です。若い頃なら違った感覚でプレイできたかもしれないと思うのですが、オッサンと化した僕には色々と面倒です。

後は実況動画を観れば良いかなー・・・と。

2017/01/14

FF15 やりこみ中

他にやりたいゲームもないので、FF15 で未クリアのサブ クエストをこなしている所です。そして、サブ クエストをこなしていると、初見クリアまでとは別の印象を持ちました。

結構、面白いな、と。

作業感の強いモブ ハント、1 つしか受注できないモブ ハント、不便なファスト トラベルなどなど、否定的に捉えているシステムも、緩くプレイする姿勢ならば気にならなくなります。始めから緩くプレイできる人ならば、FF15 に肯定的なのでしょう。僕はせっかちなのでイライラしましたが、今はのんびり車を走らせながら BGM を聞いている状態です。

Lv 99 にし、スキルを MAX にし、殆どのクエストを終えましたが、時間の掛かりそうなクエストを残して、さてどうしたものかと考えました。ダメージ限界突破や魔法威力の底上げしないと、クエスト クリアには単純に作業的な時間が掛かりそうで、それは嫌だなぁと。

問題はアビリティの充実であり、つまりは AP 稼ぎです。調べると AP 稼ぎの方法が出てきますが、ただの作業であり、それはキツイ。という事で、2 周目に入って AP 稼ぎをすることにしました。シナリオを追いながら、知らないうちに AP が貯まっていた・・・という状態の方が健全ですから。

そこで気付いた事。

2 周目に入る前には全員の服装をカジュアル スタイルにしていたのですが、カジュアル スタイルで開始するとシナリオに違和感がありません。荒野を黒服で車を押しながら友達感を押し付ける描写も、カジュアル スタイルならマッチします。

なぜ、最初からそうしなかったの?と思います。

黒服は別に良いです。正装としての設定が世界観の一部としてあり、否定するものでもありません。しかし、黒服で旅を始める事には違和感しかありません。旅の開始は旅らしくカジュアル スタイル、締める時には正装の黒服、このような使い方をすれば良いだけです。そうしていれば、ホスト風イケメン ファンタジーとして拒絶されることは無かったのではないかと。

でまぁ、2 周目クリアをしてみても、たいして AP が貯まっていないんですよねー・・・。戦闘自体は面白いので、またサブ クエストを回しながら AP 稼ぎするか、このまま放置してスマホ ゲームでもやるか、そんな所です。

2016/12/31

FF15 クリア

発売日に FF14 を DL してプレイしていましたが、やっとクリアしました。プレイ時間は 40 時間弱。サブクエスト無視ならば 20 時間程度でクリアできるのではないかと。

FF15 は、 よく出来ていてツマラナイ事はないけど、面白いと称賛する物ではない、という印象です。

FF15 は、著名なオープン ワールドと比べると、時間を忘れて楽しむまでの没入感がありません。僕は、オープン ワールドである前半部よりも、非オープン ワールドの後半部の方が楽しめました。

FF15 の世界観とシステムは、リニアな世界で活かされるものと感じます。例えば、シフト能力は、リニアな世界で縦横無尽な移動や演出を提供した方がしっくりくるのです。シフトはパーティ行動向きではなく、ノクトだけを操作する状況に向いています。

とまぁ、批判的ですが、壮年となったノクト達には味がありましたね。正直、こいつらカッコイイじゃんと思いました。このキャラクタ達ならば黒服も様になるな、と。やっぱつれぇわ・・・が馬鹿にされるラスト前の仲間達のキャンプも、僕は感動で涙が出ました。キャラクタ達の心を考えると、辛い気持ちが分かるなぁ、と。

ただまぁ良くないのは、そこまでのシナリオの流れが説明不足であり、演出不足なんですよね・・・。

2016/10/26

ThreadLocal と Closeable を利用した一時変数のプール管理

Java で 3D Graphics Engine を実装するに辺り、算術演算の過程で避けられない一時変数の取り扱いに悩んでいました。

例えば、Matrix と Vector3 クラスを作り、位置とターゲット地点と up ベクトルから姿勢行列を生成する createLookAt メソッドの実装を考えます。
この処理の過程では X/Y/Z 軸の算出が不可欠であり、通常は軸を Vector3 インスタンスで表現したいと考えます。しかし、メソッド内部に閉じた一時変数であるため、GC 負荷の軽減を考慮すると単純な new による Vector3 生成は避けるべきです。

で、どうすりゃいいの?って話です。

jMonkeyEngine (JME) のコードを見ると、そのような一時変数用に TempVars クラスを定義し、そのインスタンスを TheadLocal 変数として管理しているようです。

コレだ!と。

ただまぁ、JME では、ありとあらゆる一時変数を TempVars クラスで一括定義している事に違和感があるため、自分のコードでは純粋に 1 つのクラスのインスタンスのみを管理する MatrixPool や Vector3Pool クラスを定義して利用することにしました。要するに、必要のないクラス間の依存を避けたいってことです。コード量は増えますが、僕は不要な依存を避ける方が重要だと思っています。

後は、Java 7 より try-with-resources 構文が使えるため、プールへのインスタンスの返却を簡素化するために、プールするクラスに Closeable を implements し、close メソッドでプールへ返却する仕組みとしました。
インスタンスのプール管理では、インスタンスのプールへの返却忘れというミスが十分に考えられます。このミスを減らすために try-with-resources を利用するわけです。
まぁ、可読性も向上しているんじゃないなかな・・・と、僕は感じます。

2016/10/16

Far Cry4 クリア

今更感ですが、Far Cry4 をクリアしました。Easy モード。

やっぱ拠点攻略は楽しいですね~。
敵の位置、警報機の位置を確認し、ステルスでそれらを撃破・・・凄く楽しいです。
肉を投げて野生生物に敵を殺らせるのも楽しい。

Far Cry3 と比べるとストレスなくやれましたね。
糞 QTE を廃止してくれてありがとう!
この調子でゲーム業界から QTE が撲滅されることを僕は祈ります。

まぁ、シナリオが相変わらず糞でしたねぇ・・・。
良いと思わない、悪いと思わない、どうでも良い、そんな感じでした。
シナリオが糞なゲームはシーンもスキップできない仕様、それは世の理でしょう。

次は Far Cry Primal ですかね。

libgdx いじり

Google が提供している Java 版の Tango Examples は Rajawali をベースにしているため、自分が仕事で開発する Tango アプリも Rajawali ベースとしていましたが、最近は libGDX への移行を進めています。一応、要点については移行が...