luabind比較復雜,功能包羅萬象,但使用起來比較簡單,特別是最常用的方法只有幾個,下面結合一個簡單的例子總結一下。 在我們游戲應用中,一般都是已c++為主導的,也就是說c++主動調用lua腳本。
先寫一個比較常見的lua腳本:
- nGlobal = 10 --一個全局的整形變量
- strGlobal = "hello i am in lua" --一個全局的字符串變量
- --一個返回值為int類型的函數
- function add(a, b)
- return a+b
- end
- --一個返回值為string類型的函數
- function strEcho(a)
- print(a) 10
- return 'haha i have print your input param'
- end
- cppapi.testFunc() --調用c++暴露的一個測試函數
- t={name='ettan', age=23, desc='正值花季年齡'}
////////////////////////////////////lua腳本結束
下面寫c++函數中的調用了
- #include<iostream>
- #include<string>
- using namespace std;
- #include<lua.hpp>
- #include<luabind/function.hpp>
- void testFunc()
- {
- cout<<"helo there, i am a cpp fun"<<endl;
- }
- int main(int argc, char* argv[])
- {
- //首先聲明luaState環境
- using namespace luabind;
- lua_State* L = lua_open(); //也可以用luaL_newState()函數
- luaL_openlibs(L); //注意將lua默認庫打開,要不會出現N多錯誤的,比如print函數都沒有
- //將c++中的函數暴露給lua
- module(L, "cppapi")
- [
- def("testFunc", (void(*)(void))testFunc)
- ];
- //加載lua腳本,我們臨時起名test.lua
- luaL_dofile(L, "test.lua");
- try
- {
- //調用lua中的整形全局變量
- int nLuaGlobal = luabind::object_cast<int>(luabind::globals(L)["nGlobal"]) ;
- //調用lua中的字符串變量
- string strLuaGlobal = luabind::object_cast<string>(luabind::globals(L)["strGlobal"]);
- //獲取table,方法一,通過luabind::object 固有方法
- luabind::object luaTable = luabind::globals(L)["t"] ;
- string name=luabind::object_cast<string>(luaTable["name"]) ;
- int age = luabind::object_cast<int>(luaTable["age"]) ;
- //獲取table,方法二,通過gettable
- string desc = luabind::object_cast<string>(luabind::gettable(luaTable,"desc"));
- //下面是調用lua中函數
- int nAddRes = luabind::call_function<int>(L, "add", 3, 4) ;
- string strEchoRes = luabind::call_function<string>(L, "strEcho", "c++參數") ;
- }
- catch(...)
- {
- cout<<"error"<<endl;
- }
- return 0;
- }
我們目前常用的方法暫時就有這些,當然在實際編碼中,c++暴露給lua的經常是c++類中的函數,只要稍加修改就行!