[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

「[libgdx] バックボタンでアプリの終了ダイアログを実装する」への2件のフィードバック

  1. Есть такая услуга – добровольное медицинское обслуживание .
    Она предполагает, что вы вносите небольшую сумму за то, что посещает врачей в течение года БЕСПЛАТНО.
    Однако соцопросы показали, что лишь 6% жителей города знают об этом.
    По какой причине?
    Потому что частным клиникам намного выгодней брать плату за каждое посещение.
    А если какой-нибудь сотрудник клиники попытается посоветовать добровольное медицинское обслуживание клиенту – это сулит ему увольнением.
    Информация о ДМО уже вызвала множество скандалов, сразу после того как информацию об этом рассекретил один врач.
    Его уволили “по собственному желанию”, после того, как он посоветовал ДМО постоянному клиенту.
    Самое невероятное, что информация по ДМО присутствуют в открытом доступе, просто натыкались на эту информацию только случайные люди.
    Как отстоять свои права?
    О правилах предоставления услуги и обязанностях клиник можно узнать, просто вбив в Яндекс фразу: “добровольное медицинское обслуживание”.
    Именно обслуживание, а не страхование.

    34j5c6h86

  2. Есть такая услуга – добровольное медицинское обслуживание (или ДМО).
    Она предполагает, что пациент вносит небольшую сумму за абонемент и ходит на прием в течение года не платя за каждый прием.
    Однако опросы показали, что лишь 6% жителей Санкт-Петербурга знают о такой программе.
    По какой причине?
    Да потому что клиникам намного выгодней сдирать с людей деньги за каждый визит.
    А если честный врач попытается посоветовать добровольное медицинское обслуживание клиенту – это сулит ему увольнением.
    Эта информация уже вызвала множество скандалов, после того как информацию об этом рассекретил один врач.
    Его уволили , после того, как он предложил ДМО своему пациенту.
    Самое ужасное, что информация по ДМО находились в открытом доступе, просто находили на эту информацию только случайные люди.
    Как отстоять свои права?
    О правилах оказания такой услуги и обязанностях клиник можно узнать, просто вбив в Яндекс фразу: “добровольное медицинское обслуживание”.
    И именно обслуживание, а не страхование.

    34j5c6h86

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です