[libgdx] バックボタンでアプリの終了ダイアログを実装する

[libgdx] バックボタンでアプリの終了ダイアログを実装する

libgdxでゲームを作ると、androidのバックボタンおした時にゲームが終了してしまいます。UI的には「ひとつ前の画面に戻るつもりだったのにアプリが終了しちゃった!」ってことになるわけで、これを防ぐためにバックボタンおした時の挙動を実装するのがユーザーライクかなと思っています(あくまで個人的な感想)。

というわけで、バックボタンを押したら「アプリを終了しますか?Yes/No」ダイアログが表示されるようにしようと試みました。

(難しかった・・・。)

とりあえずlibgdxでダイアログを表示するのはどうしたらいいのかなと思って調べてみると下記が見つかりました。

http://qiita.com/fslasht/items/e152a743ec56d057e643

http://stackoverflow.com/questions/29144352/libgdx-alert-dialog

日本語のサイト殆ど無いですね・・・。結構需要があるのではと思いますが。

最初は、「libGDXでプラットフォーム独自の機能を呼び出す」を参考にして実装してみたんですが、私の理解不足でうまくいかなかった。ダイアログの表示まではいけたんですが、OK/Cancelの返り値をどうやってlibgdxに渡せばいいのかとわからなくなってすぐに諦めちゃいました。(なんか今ならなんとかできそうな気がする。ま、いいや。)

もう一個の参考サイトはScene2dのDialogクラスを使うというもの。これまでに色々英語サイト読んでもう英語読むの疲れたのと、違うアイデアを思いついたので実践してません。

違うアイデアというのは、「もうダイアログじゃなくてもいいや。バックボタン押したら文字とボタンが画面に表示されるという形でいいじゃん。ダイアログ風に見えるでしょ。」と思って(やっと気づいて)、これが簡単でうまくいったのでとりあえずメモに残しておこうと思います。

Overlap2Dでバックボタン押した際に表示させたい文字・ボタン等を作成します。

dialogoverlap2d

Stageを継承したポーズ画面クラスを作成します。バックボタンを押したらこの画面が表示されます。

バックボタンが押されたらゲーム画面で上で作ったBauseStageを呼び出します。

私はMyScreenAdapterクラスを作成しておいてそれを継承したゲーム画面を作っているので、MyScreenAdapterクラスにバックキーを読み取れるようにするのと、押した際の挙動を記載します。MyScreenAdapterはScreenだけでなくInputProcessorクラスを拡張します。

最初はInputProcessor無しでやってたんですが、機能する時としない時があったので、InputProcessorを継承し、バックキーをおした時の処理も記載しました。なので、MyScreenAdapterでもバックキーの処理が実装されていて、GameScreenでも実装されていてと、二重に処理が書かれていて気持ち悪いのですが、こうすると今のところうまくいったのでこうしてます。(今ふと思ったけど、keyDownじゃなくてkeyUpにすると片方だけでもうまくいったりするかな?ま、次回試してみよう。)

(参考)

http://stackoverflow.com/questions/14802909/libgdx-android-intercepting-back-key-and-confirm-exit

http://stackoverflow.com/questions/7223723/in-libgdx-how-do-i-get-input-from-the-back-button