2012年5月1日火曜日

ヴィータのアプリをハードキーで終了するように作る & 確認ダイアログの動きについて

今回の記事は、PSVITA(プレイステーション ヴィータ)+PlayStation Suite (Pss)で開発したアプリの終了を、ハードキーで行う方法について書かせて頂きたく思います。

アプリの終了を行うのに、画面にボタンを設けるのも良いのですが、そうするとレイアウトがきつくなる場合もある・・・じゃあどうしようとなると、ヴィータ自慢のハードキーに割り当てれば良いじゃないかと思って作ってみました。

※追記
今回の終了機能の実装は、既に作ってあるアプリ、正規表現チェッカに対して実装致しました。
これを書き忘れていました。申し訳ありません。
元になった、正規表現チェッカの記事はこちらです

また、画面にボタンを設けてタッチすることによるアプリ終了方法については、こちらのリンク先になります。


それに、スタートボタンかセレクトボタンなら、ヴィータ表面と同じ高さなので、間違って押し込んでしまう「暴発」も出にくい!!

と、いうわけで、「終了機能」ですが・・・「スタートボタン」に割り当ててみる事にしました。

押しにくい!と不評のこのボタンですが、こういう場合に適合するようにあえてそう設計されたんじゃないかと思えます。

少なくとも、今回のような用途には渡りに船なわけです。

■プログラムコード■

※終了の前にダイアログにて「終了してよろしいですか?」と確認してますが、ヴィータ独特の動きについて特記事項がありますので後述いたします。

        private static GraphicsContext graphics;
  private static bool bRES; //処理継続フラグ
  private static bool bMSG; //確認メッセージ表示状態フラグ
        public static void Main (string[] args)
        {
            Initialize ();

            while (bRES) {
                SystemEvents.CheckEvents ();
                Update ();
                Render ();
            }
        }

        public static void Initialize ()
        {
            // Set up the graphics system
            graphics = new GraphicsContext ();
            // Initialize UI Toolkit
            UISystem.Initialize(graphics);
            // Create scene
            var MyScene = new mmmRegexChecker.Cls_Scene();
            // Set scene
            UISystem.SetScene(MyScene, null);
   bRES = true;
   bMSG = false;
        }
  
        public static void Update ()
        {
            // Query gamepad for current state
            var gamePadData = GamePad.GetData (0);

            // Query touch for current state
            List touchDataList = Touch.GetData (0);
   
            // Update UI Toolkit
            UISystem.Update(touchDataList);
   
   if(gamePadData.ButtonsDown.Equals(GamePadButtons.Start))
   {
    //まだ確認メッセージが表示されていない時のみ表示
    if(!bMSG)
    {
          bMSG = true;
     MessageDialog.CreateAndShow(MessageDialogStyle.OkCancel,
                                 "ヴィータより確認",
                                 "終了してよろしいですか?"
     ).ButtonPressed+= HandleButtonPressed;
    }
   }
        }

        private static void HandleButtonPressed (object sender, MessageDialogButtonEventArgs e)
        {
             bMSG = false;
         if(e.Result.Equals(MessageDialogResult.Ok))
   {
    bRES =false;
   }
        }

Update()の中で、ハードウェアキー判定を行い、スタートボタンの時にメインループを抜ける細工をしています。
しかし、それだけならストレートなんですが、いきなり終わらせずに確認ダイアログで終わっていいかどうか確認しています。

このダイアログ、Windowsの確認ダイアログとは挙動が全然違うのです。
確認ダイアログで「いいか?」と操作者に問いかけている最中も、プログラムは停止しないでガンガン先に進みます。

情報端末ならではの挙動というか、この挙動に気が付かないままプログラムすると泥沼にはまることもあるので注意が必要です。

androidアプリも、Java言語とC#言語の違いはあれども、同じ挙動でした。
ダイアログのボタンにイベントを実装して、以降はそっちの処理に飛ぶという設計にしていくわけです。
また、スタートボタンを押すたびに何回もダイアログが呼び出されないように、状態フラグを設けて、1回のみ表示するように制御しています。

■実際のヴィータアプリの動き■

自作アプリを起動して、さて、スタートキーを押して終了してみます。ちなみに、起動中に「めざまし同盟」によるアラームが発動しました。
めざまし同盟、しっかりとした仕事っぷり。今朝もありがとーーです。

さて、スタートボタンを押します。確かに押しにくいですが、これが暴発しない秘訣なんだから文句どころか「なるほど」な設計です。今となれば。

終了して、PS Suite Devのライブエリアに戻ります。

ライブエリアのゲートから中に入り直すと、自作アプリのリスト画面になりますので、他のアプリを起動するなりまた次のアクションに入ることが出来ます。

今から会社です。ゴールデンウィークは一旦終わりですが、今日も一日全力で頑張るぞー。