くまちゃんのiOS/Androidゲームプログラミング

マイペースでゲームつくってます。

RPGのメッセージをダイアログに

表示させたかったんですよ。

RPGをつくろうとした時に、メッセージ欄の実装ってすっごくめんどくさそうじゃないですか。
テキストの改行、とくにスクロールは考えただけでプログラムする気がなくなります。
そこで、スマホのUIの代表選手と言っていい「ダイアログ」を使うと、この悩みは一気に解消されるではないですか。

でも、iOSでもAndroidでも入門書ではそういったサンプルは見たことがないですね…。
で、試行錯誤してみたのですが、結構難産でした。

まず、表示させるテキストをどこに格納するのか。
通常のダイアログの使い方では、表示するテキストは短文で、しかも定型なものがほとんどですので、サンプルではたいていコードに表示させるテキストを書き込んでしまっています。
RPGでは長文で、場面によってープログラム的にはフラグに従って、表示するテキストもころころ変わります。
ですので、これはコードに埋め込むなんてやってられない。
調べると、ダイアログの表示元はテキストファイルからの読み込みからでもOKなことがわかりましたので、それであればいくらでも拡張可能です。まあ、実際にひとつのゲームでフラグを気にしながら対応するファイルを呼び出すには設計をうまくしないとスパゲッティになってしまうと思いますが。
あと、テキストファイルを「どこに格納するのか」が問題になりますが、iOSでもAndroidでもプロジェクトの中に画像や音のリソースと同様に放り込んでおけば、それぞれ呼び出すメソッドがありますので簡単でした。
ちなみに、AndroidではAndroid Studioでリソースフォルダを作る操作をして「assets」フォルダを作り、そこに放り込まないといけません。試しにAndroid Studioを使わず、プロジェクトのフォルダに直接assetsフォルダを作ってみたのですが認識されませんでした。おとなしくAndroid Studio上で作りましょう。Gradle用のコードが生成されないと認識しないと思われます。

で、次はAndroidでしか試していないのですが、ハマったのがダイアログの呼び出しです。
私の今のプロジェクトは、SurfaceView上で描画と合わせてキャラクターの衝突判定も行っているのですが、メッセージを表示したいキャラクターと衝突した際にダイアログを表示させようとするとコードにエラーが出てビルドできませんでした。
結構、長時間ネットをさまよいましたが、結論から言うと、ダイアログの呼び出しはActivityを継承しているクラス(ほとんどがMainActivityと思われ)から呼び出す必要があるので、MainActivityにダイアログ表示のメソッドを書き、SurfaceViewで欲しいタイミングでMainActivityのメソッドを呼びださなければいけなくなりました。

あれ?どうやって呼び出すの?

これも検索しにくい悩みで、結局グーグル先生に教えてもらうことはあきらめ、半ば強引に当てずっぽうでコードを書いてみたんですが、とりあえず動いたので良しとしました。
MainActivityがSurfaceViewをnewする時のコンストラクタに、自身をMainActivity型の引数として渡しておき、それをSurfaceView側でMainActivity型のprivate変数(仮にmainSurfaceViewとする)に代入(保存)しておけば、ダイアログを表示したい時にMainActivityに実装したダイアログ表示メソッドを呼び出すことができます。

これがスマートな方法なのかはわかりません。あんまり見たことないので自信はないですが、とりあえず動いたのでよし、としましょう。
f:id:tadakazu1972:20150906232039p:plain