[Lua脚本实践3]LuaPlus中类成员的调用

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();

}

 执行结果是“看见”!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章