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();
}
执行结果是“看见”!