複雑なデータの取り扱い 改良版
データを取り込み用関数を登録して、複雑なデータに対処する
以前、Lua側で複雑な入り組んだデータを定義し、これをScenarioModで取得しました。
データの取り込みには成功しましたが、それでも若干見通しが悪いプログラムとなっていました。
しかし、「データ取り込み用」の独自の関数をLuaへと提供できるのであれば、
これを大幅に簡略化できます。
-
BushouData.txt
以下のように対象となるtxtファイルを「天翔記フォルダ」に用意します。
local data_list = {
{['名前']="武田信玄" , ['政治']=100, ['戦闘']= 90, ['智謀']=80},
{['名前']="上杉謙信" , ['政治']=70, ['戦闘']=120, ['智謀']=70},
{['名前']="北条氏康" , ['政治']=105, ['戦闘']= 80, ['智謀']=90},
}
for i, data in ipairs(data_list) do
ImportBushouData( i, data['名前'], data['政治'], data['戦闘'], data['智謀'] )
end
この取り込み用の「ImportBushouData」という関数をScenarioModに用意してやれば良いのです。
そうすれば、以前とは比べ物にならないほど、簡潔で見通しの良いプログラムが可能となります。
-
カスタム駆動関数.cpp
struct myパラメタ型 {
int 番号;
string 名前;
int 政治;
int 戦闘;
int 智謀;
};
vector<myパラメタ型> vBushouDataList;
// ImportBushouData に相当する関数。1人分のデータを受け取って、そのままC++内の配列へと付け足す。
int Lua_ImportBushouData(lua_State *L) {
myパラメタ型 data;
// 1番目の引数が実数形式であれば…
if ( lua_isnumber(L, 1) ) {
data.番号 = lua_tointeger(L, 1);
}
// 2番目の引数が文字列形式であれば…
if ( lua_isstring(L, 2) ) {
data.名前 = lua_tostring(L, 2);
}
// 3番目の引数が実数形式であれば…
if ( lua_isnumber(L, 3) ) {
data.政治 = lua_tointeger(L, 3);
}
// 4番目の引数が実数形式であれば…
if ( lua_isnumber(L, 4) ) {
data.戦闘 = lua_tointeger(L, 4);
}
// 5番目の引数が実数形式であれば…
if ( lua_isnumber(L, 5) ) {
data.智謀 = lua_tointeger(L, 5);
}
// C++内のリスト変数にdata追加
vBushouDataList.push_back(data);
// Lという画用紙に最後に書いた引数群を削除
lua_pop(L, lua_gettop(L));
// この関数が呼ばれた際に返す返り値の個数を返す
return 0;
}
void カスタム::On_起動時() {
try {
// Lua_ImportBushouData関数 を ImportBushouData という名前でLの画用紙に登録
lua_register(L, "ImportBushouData", &Lua_ImportBushouData);
// ファイルを読み込んで実行
LUA::Do_ファイル("BushouData.txt");
} catch(...) { }
for each(myパラメタ型 data in vBushouDataList) {
デバッグ出力 << data.番号 << endl;
デバッグ出力 << data.名前 << endl;
デバッグ出力 << data.政治 << endl;
デバッグ出力 << data.戦闘 << endl;
デバッグ出力 << data.智謀 << endl;
デバッグ出力 << string(20, '-') << endl;
}
}
というように、非常に見通しが良いプログラムとなりました。
ファイルを読み込むよりも先に「ImportBushouData」という関数をLの画用紙へと登録します。
そして、ファイルを読み込み、実行すれば、forループと、ImportBushouData 関数により、データが終わるまで、取得されることがわかるでしょうか。
このように独自の関数を登録を上手く利用すれば、プログラムの見通しをよくすることが可能となります。
|