剛開始使用luabind,對一些基本的使用有些了解,記錄下來以備查閱。這篇文章里主要討論如何在C++中訪問lua腳本中的變量,函數。
假設有一個test.lua腳本,內容如下:
1
--test.lua
2
3
function printColor()
4
colour = ColourValue(1, 1, 1, 1);
5
colour:printColor();
6
end
7
8
Config =
9

{
10
color = ColourValue(1, 1, 1, 1),
11
count = 5,
12
fun = printColor
13
14
}
ColourValue是C++類,定義如下:
1
class ColourValue
2

{
3
public:
4
ColourValue(float r = 1.0,
5
float g = 1.0,
6
float b = 1.0,
7
float a = 1.0) : mR(r), mB(b), mG(g), mA(a)
8
{
9
}
10
11
void printColor()
12
{
13
cout << mR << ", "
14
<< mG << ", "
15
<< mB << ", "
16
<< mA << ", "
17
<< endl;
18
}
19
20
protected:
21
float mR;
22
float mG;
23
float mB;
24
float mA;
25
};
C++導出類到lua中可以見之前的一篇文章(點這里),就不再贅述,假設ColourValue和它的成員函數printColor()已經導出到lua,那么如何在C++中訪問Config表中的變量呢?這里就要用到luabind中的globals(lua_State* L)函數 。
這個函數返回的是全局表,表中包含加載的lua腳本中所有的變量,下面依次講解如何來獲取Config表中的三個變量。
1
// 取得全局表對象。
2
luabind::object global = luabind::globals(L);
lua腳本中的所有元素都是放在這個全局表中的,所以可以用lua table的語法來訪問其中的元素:
1
// 獲取腳本中的Config表。
2
luabind::object configTable = global["Config"];
這樣,就可以通過configTable訪問Config表中的元素了: ①訪問color:
1
// 訪問Config表中的color。
2
ColourValue color = luabind::object_cast<ColourValue>(configTable["color"]);
注意,這里有一個轉型動作,因為ColorValue類已經導入到lua中,所以luabind知道如何轉換,否則,轉換將發生異常。
②訪問count:
1
// 訪問Config表中count。
2
int count = luabind::object_cast<int>(configTable["count"]);
有了之前的講述,這個應該很好理解了。 ③訪問printColor:
1
// 訪問Config表中的printColor函數。
2
luabind::object printColor = configTable["fun"];
在C++代碼中調用printColor有兩種方法:
1
printColor(); // 第一種調用方法。
2
luabind::call_function<void>(printColor); // 第二種調用方法。
注意第二種調用方法使用了call_function函數的重載形式。
如果要訪問全局表中的變量,方法是一樣的,只不過是使用globle句柄進行訪問,這里就不再贅言。