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

}

 執行結果是“看見”!


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