LuaPlus對類的調用似乎有一點點麻煩,這個我也是在嘗試中寫了一點代碼
1.簡單類的調用。
根據Lua例題,構造了一個類
class CTestCallBack
{
public:
int NonVirtualFunc(LuaState *state)
{
LuaStack args(state);
printf("In non-virtual member function. no msg. ");
return 0;
}
int virtual VirtualFunc(LuaState *state)
{
LuaStack args(state);
printf("In virtual member function.msg=%s ", args[1].GetString());
return 0;
}
};
這個類中每一個成員函數都使用了Lua回調的特性,因此直接可以用Register()函數進行註冊使用,以下是main()函數:
int main()
{ LuaStateOwner state;
CTestCallBack tes;
state->GetGlobals().Register("MyFun",tes,&CTestCallBack::VirtualFunc);
// 執行Lua腳本:
state->DoString("MyFun('我出現了')");
}
這樣,我們就可以通過腳本執行VirtualFunc()函數。
2.在類中調用另一個類的函數。
#include <iostream>
using namespace std;
#include "..\..\LuaPlus\src\LuaPlus\LuaPlus.h"
#define LUA_OK 0
class CTestCallBack
{
public:
int NonVirtualFunc(LuaState *state)
{
LuaStack args(state);
printf("In non-virtual member function. no msg. ");
return 0;
}
int virtual VirtualFunc(LuaState *state)
{
LuaStack args(state);
printf("In virtual member function.msg=%s ", args[1].GetString());
return 0;
}
};
class Test
{
public:
void FuncShow()
{
LuaStateOwner state;
state->GetGlobals().Register("MyFun",tes,&CTestCallBack::VirtualFunc);
// 執行Lua腳本:
state->DoString("MyFun('我出現了')");
}
CTestCallBack tes;
};
int main()
{
Test t;
t.FuncShow();
getchar();
}
在上面的例子中,我們通過一個叫做Test的類,對類內的CTestCallBack 類型成員tes調用了VirtualFunc函數。
3.註冊任意的類函數。
剛剛說的例子類的成員函數的參數都是Lua的那個回調格式的,對於任意的類函數也可以註冊到Lua中調用使用。
#include <iostream>
using namespace std;
#include "..\..\LuaPlus\src\LuaPlus\LuaPlus.h"
#define LUA_OK 0
class Test
{
public:
int Testadd(int a, int b){return a+b;}
};
int main()
{
LuaStateOwner state;
Test test;
state->GetGlobals().RegisterDirect("MyFMemberSumun", test, &Test::Testadd);
state->DoString("print(MyFMemberSumun(1,2))");
}
這個例子中Testadd就是隨意的一個類的函數。4.從一個類中通過lua調用任意一個類中的函數
#include <iostream>
using namespace std;
#include "..\..\LuaPlus\src\LuaPlus\LuaPlus.h"
#define LUA_OK 0
class Test
{
public:
int Testadd(int a, int b){return a+b;}
void Show(){cout<<"看見!"<<endl;}
};
class Go
{
public:
void Show()
{
LuaStateOwner state;
Test test;
state->GetGlobals().RegisterDirect("MyFMemberSumun", test, &Test::Testadd);
state->DoString("print(MyFMemberSumun(1,2))");
}
};
int main()
{
Go g;
g.Show();
getchar();
}
5.從一個類中通過lua腳本文件執行一個類中的函數
這個算是比較花哨的了~~在Lua文件內寫一個函數,通過這個函數可以執行任意一個類中的函數。
首先,寫一個簡單的lua文件:
function Add(x, y)
PrintNumber();
end
通過調用Add函數 ,可以調用Test類中的Show函數
#include <iostream>
using namespace std;
#include "..\..\LuaPlus\src\LuaPlus\LuaPlus.h"
#define LUA_OK 0
class Test
{
public:
int Testadd(int a, int b){return a+b;}
void Show(){cout<<"看見!"<<endl;}
};
class Go
{
public:
void Show()
{
LuaStateOwner state;
Test test;
state->DoFile("test.lua");
state->GetGlobals().RegisterDirect("PrintNumber", test, &Test::Show);
state->DoString("Add(1,2)");
}
};
int main()
{
Go g;
g.Show();
getchar();
}
執行結果是“看見”!