宣伝: 『「シミュレーション仏教」の試み』(JRF 著)。Amazon Kindle で、または、少し高いですが、DRM フリー EPUB を BOOTH で、販売中!
技術系電子本。Python による仏教社会シミュレーション( https://github.com/JRF-2018/simbd )の哲学的解説です。

« CON_PRINT: プチコンmkII用コンソールPRINT | トップページ | HLPVIEW: プチコンmkII用の簡易アドヴェンチャーゲーム用ルーチン »

2013年2月22日 (金)

POPUP_MNU_RA: プチコンmkII用のポップアップメニュー

STACKLIB に付いてくる ctrllib.prg は、今風の「ジェスチャ入力」「モーションコントローラ」には対応していない。わざわざライブラリにするぐらいだから、そういうのを期待されるのかもしれないが、『易双六 PTC』で使うのに必要とした部分のみしか作っていないというべきで、ウリと言えば、自分で使っていて便利だなと思ったポップアップメニューのルーチン @POPUP_MNU_RA になる。
この関数の呼び出しは簡単で、基本は、メニューの表示項目とそれがクリックされたときに返すべき値のペアを連想配列 RA$[] に指定していくだけである。

  RA$[0,0] = "Yes"
  RA$[0,1] = STR$(1)
  RA$[1,0] = "No"
  RA$[1,1] = STR$(0)
  RN = 2
  R = -1: GOSUB @PUSH_R
  R = -1: GOSUB @PUSH_R
  GOSUB @POPUP_MNU_RA


上で -1 を二つ引数として渡している。ここの部分は本来、表示すべきコンソールウィンドウのサイズ W,H を指定すべきところだったが、開発の過程で @CON_PRINT の PRINT_SIZE_R を作り、エスケープシーケンスを含むような場合も、そういった指定なしで、ほぼ自動的にサイズを調整できるようになったため、自動で調節することを指定する -1 を入れて使うのが普通になった。

むしろ、ポップアップメニューのサイズ調整をしたければ、@POPUP_MNU_RA は @CON_PRINTで出てきた CLIP_C{X,Y,W,H} のクリッピング領域を認識して、位置やサイズを決めるので、そちらをいじっておくほうが、便利だろう。

なお、こういうポップアップメニューを使うとき特定のボタンに特定の項目を割り当てたいというのは、ニンテンドーDSがゲーム機である以上、当然の欲求だろう。

それは、メニュー表示項目に "\B[A]" などと指定することでできる。まぎらわしいが、これは @CON_PRINT の "\N[A]" とは違う。ただ "\B[A]" で指定しておいたのを、あとから指定するメニュー表示項目に "\N[A]" を含めてそのボタンが使えることを示すのがマナーというべきものだろう。

メニューの選択はタッチではなく、十字ボタンでもできる。はじめ選択されたところがない状態で、十字ボタンの上を押すと一番下が、下を押すと一番上が選択され「カーソル」が出る。「カーソル」があるところをタッチするか、そこで A ボタンを押すと、この関数は終了し、指定された文字列を返す。

その選択を最初から特定の項目にあるようにするのが、文頭の "\S" のエスケープシーケンスになる。

また、大事なこととして、B ボタンが押されるとキャンセル扱いとみなし、 RT$ に "NONE" の値が返る。これを防止したいときは "\B[B]" のメニュー項目を作っておけばよい。その値は "" を指定する。

メニュー項目中、値が "" のものは無視される。

以上を取り込んだ呼び出し例は次のようになる。キャンセルは認めず、Yes か No かを待つ。

  RA$[0, 0] = "\N[Y]Yes"
  RA$[0, 1] = STR$(1)
  RA$[1, 0] = "\S\N[X]No"
  RA$[1, 1] = STR$(0)
  RA$[2, 0] = "\B[Y]"
  RA$[2, 1] = STR$(1)
  RA$[3, 0] = "\B[X]"
  RA$[3, 1] = STR$(0)
  RA$[4, 0] = "\B[B]"
  RA$[4, 1] = ""
  RN = 5
  R = -1: GOSUB @PUSH_R
  R = -1: GOSUB @PUSH_R
  GOSUB @POPUP_MNU_RA

  PRINT R$


なお、連想配列を文字列化せず、そのまま渡すようにしているのは、メッセージの長さなどから、それらを連結すると往々にして 256 バイト制限に引っかかるからである。


仲間の関数


@POPUP_MNU_RA は、@MNU_CTRL_* という関数群を用いて実装している。この別系列として ctrllib.prg には @TCH_CTRL_* という関数群もあり、こちらはタッチセンス用に作られたもので、項目の長押し等にも対応したが、「ジェスチャ入力」などはできない。@MNU_CTRL_* のほうには @MNU_CTRL_* を使いながら @POPUP_MNU_RAを使えるよう専用のスタックがあり、コントローラを push pop して使えるが、それは @TCH_CTRL_* には対応していない(そもそも別管理なので @TCH_CTRL_* を使いながらポップアップは出せる)。

なお、項目の長押しを使うときは、それを最初のほうに登録しておかないと先に別の領域がセンスされることに注意を要する。

また、@MNU_CTRL_* はコンソール座標系で指定を行うが、@TCH_CTRL_* のほうはグラフィック座標系で行うというのも注意を要するところである。


配布物やライセンス、関連等


STACKLIBの記事をご参照ください。
更新: 2013-02-22
初公開: 2013年02月22日 18:17:34
最新版: 2013年02月22日 19:08:24

2013-02-22 18:17:29 (JST) in プチコン | | コメント (0) | トラックバック (0)

批評や挨拶のためのネットコミュニティ

  • はてなブックマーク(って何?) このエントリーをはてなブックマークに追加 このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク
  • Twitter (って何?)

トラックバック


トラックバックのポリシー

他サイトなどからこの記事に自薦された関連記事(トラックバック)はまだありません。
» JRF のソフトウェア Tips:POPUP_MNU_RA: プチコンmkII用のポップアップメニュー (この記事)

コメント

コメントを書く



(メールアドレス形式)


※匿名投稿を許可しています。ゆるめのコメント管理のポリシーを持っています。この記事にまったく関係のないコメントはこのリンク先で受け付けています。
※暗号化パスワードを設定すれば、後に「削除」、すなわち JavaScript で非表示に設定できます。暗号解読者を気にしないならメールアドレスでもかまいません。この設定は平文のメールで管理者に届きます。
※コメントを書くために漢字[かんじ]でルビが、[google: キーワード] で検索指定が使えます。


ランダムことわざ: 七転び八起き。