そろそろネタが尽きてきた感のある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); }