テキストで選択肢を返したい

Last-modified: 2007-10-26 (金) 22:25:10

 そろそろネタが尽きてきた感のあるstringの解説。

 

概要

 今回はいつもint nIDで返ってくる選択肢をテキストで返してみる関数を作ってみます。
 ……と聞いて、「CSactMenu構造体の改造かな」と思った人は、残念!
 構造体の改造なんて出来ませんよ。akt.さんじゃないんだから。

 

 やっていることは簡単かつ単純です。
 あらかじめテキストを入れるための配列を作っておき、MENU_ADDとMENU_SELECTそれぞれの、その配列を利用するようなアレンジを加えたものを作成。
 配列の要素を番号に見立てて入れておき、戻り値で配列の中身から番号のテキストを取り出すだけです。

 

array@string g_asMenu_Text; //グローバルstring配列を作っておきます
int MENU_ADD2(int nID, string text, menu_call_t call = NULL)
{
  if(nID >= g_asMenu_Text.Numof())
     {g_asMenu_Text.Realloc(nID + 1);}
  g_asMenu_Text[nID] = text;
  return g_theSactMenu.AddSelectText(nID, text, call);
}
string MENU_SELECT2(int nDefaultIndex = -1)
{
  int nX = g_theSactMenu.Select(nDefaultIndex);
  return g_asMenu_Text[nX];
}

作ったら動かしてみましょう。


void game_main(void)
{
  MENU_ADD2(1,"腋レミ派。");
  MENU_ADD2(2,"腋アリ派。");
  string szX = MENU_SELECT2;
  S(szX); A;
}

 "腋レミ派"と表示されます選んだ項目の文字列が表示されます。

解説

 見ての通り、脇からかっさらう形です。ほとんどMENU_ADDとMENU_SELECTと同じ。
 これ系の関数なかったっけ? とSACT2のマニュアルを見てみましたが、パッと見では無かったようです。
 多い量の選択肢をつくる場合は、分岐のさい、番号よりもテキストの方が「行為」と直結させやすい分、わかりやすいかもしれません。

おまけ

 通常、MENU_ADDのnIDにマイナスを入れると、その値の選択肢は無効にされます。
 しかし上のMENU_ADD2だと実行時のエラーが出てしまいます。この差を解消してみましょう。
 また、配列に値を詰めすぎるのは良くないので、中をオールクリアするコマンドも入れてみます。

 
 

int MENU_ADD2(int nID, string text, menu_call_t call = NULL)
{
  if(nID  < 0){return 0;}
  if(nID == 0)
     {
     if(text == "YN")
        {
        MENU_ADD2(1,"はい");
        MENU_ADD2(2,"いいえ"); return 0;
        }
     if(text == "CLEAR")
        {
     g_asMenu_Text.Alloc(1);return 0;
        }
     }
  if(nID >= g_asMenu_Text.Numof())
    {g_asMenu_Text.Realloc(nID + 1);}
  g_asMenu_Text[nID] = text;
  return g_theSactMenu.AddSelectText(nID, text, call);
}