データを取り込み用関数を登録して、複雑なデータに対処する
mrubyに記述しているテーブルデータを、ScenarioMod側へと読み込んでみましょう。
ScenarioModでは、mrb_state* 型のmrbというグローバル変数がすでに登録されています。
又、mrubyに最初から付属しているヘッダーファイルは、ほぼ全て読み込まれていますので、
mrubyの様々なWeb上の情報をそのまま利用しやすいでしょう。
以下のように対象となるtxtファイルを「天翔記フォルダ」に用意します。
(BushouData.txt)側
data_list = [
{'名前'=>"武田信玄" , '政治'=>100, '戦闘'=> 90, '智謀'=>80},
{'名前'=>"上杉謙信" , '政治'=>70, '戦闘'=>120, '智謀'=>70},
{'名前'=>"北条氏康" , '政治'=>105, '戦闘'=> 80, '智謀'=>90},
]
for data in data_list do
ImportBushouData( data['名前'], data['政治'], data['戦闘'], data['智謀'] )
end
この取り込み用の「ImportBushouData」という関数をScenarioModに用意してやれば良いのです。
(カスタム駆動関数.cpp)
struct myパラメタ型 {
string 名前;
int 政治;
int 戦闘;
int 智謀;
};
vector<myパラメタ型> vBushouDataList;
// ImportBushouData に相当する関数。1人分のデータを受け取って、そのままC++内の配列へと付け足す。
static mrb_value mrb_ImportBushouData(mrb_state *mrb, mrb_value self) {
myパラメタ型 data;
mrb_value 名前;
mrb_int 政治;
mrb_int 戦闘;
mrb_int 智謀;
mrb_get_args(mrb, "Siii", &名前, &政治, &戦闘, &智謀); // S=String, i=整数 f=浮動小数
data.名前 = RSTRING_PTR(名前); // RObjectという共用の型をchar*と見なして~
data.政治 = 政治;
data.戦闘 = 戦闘;
data.智謀 = 智謀;
// C++内のリスト変数にdata追加
vBushouDataList.push_back(data);
// selfを返す。
return self;
}
void カスタム::On_起動時() {
struct RClass *krnm;
krnm = mrb->kernel_module; /* ココ2行は関数を特定のクラス内ではなく、グローバルに登録するため。*/
mrb_define_method(mrb, krnm, "ImportBushouData", mrb_ImportBushouData, MRB_ARGS_REQ(4)); // 関数登録。引数4つだよ
try {
MRUBY::Do_ファイル("BushouData.txt");
}
catch (...) {}
for each(myパラメタ型 data in vBushouDataList) {
デバッグ出力 << data.名前 << endl;
デバッグ出力 << data.政治 << endl;
デバッグ出力 << data.戦闘 << endl;
デバッグ出力 << data.智謀 << endl;
デバッグ出力 << string(20, '-') << endl;
}
}
というように、比較的簡潔なプログラムとなりました。
ファイルを読み込むよりも先に「ImportBushouData」という関数をmrbへと登録します。
そして、ファイルを読み込み、実行すれば、forループと、ImportBushouData 関数により、データが終わるまで、取得されることがわかるでしょうか。
このように独自の関数を登録を上手く利用すれば、プログラムの見通しをよくすることが可能となります。