天天看點

[Lua腳本實踐2]LuaPlus中關于函數的調用

   LUA和C++ 之間的函數調用是應用最廣的,調用方式也和豐富。

1.全局函數被Lua語句調用

#include <iostream>
using namespace std;
#include "..\..\LuaPlus\src\LuaPlus\LuaPlus.h"

#define LUA_OK 0

void show(int a, int b){ cout<<"C函數在Lua内列印"<<a+b<<endl;}

int main()
{
	LuaStateOwner state;

	// 執行Lua腳本:
	state->DoString("print('歡迎 World\\n')");

	//注冊C語言函數到Lua中
	state->GetGlobals().RegisterDirect("add", show);
	state->DoString("add(4,7)");
}
           

    全局函數show在Lua中可以換個名字調用,利用RegisterDirect()函數将show注冊到腳本中以add取代之。然後在腳本中執行add函數,得到的結果和執行show是一樣的。

2.對.lua腳本檔案中的函數調用

     1)在Lua腳本内執行。

對于Lua中的函數的調用方式也很多,就舉幾個例子吧。還是上免得程式不變,隻更改.Lua檔案中的内容

function Add(x, y) 
      return x+y; 
end

print(Add(3,5));
           

運作結果,螢幕上會輸出8.

   2)在Lua腳本内的函數被C++執行。

    除了可以在Lua内中執行以外,還可以在C++環境中執行。把上面的那個Lua檔案最後的那行列印語句删掉,用下面的C++語句調用Add函數。

#include <iostream>
using namespace std;
#include "..\..\LuaPlus\src\LuaPlus\LuaPlus.h"

#define LUA_OK 0

int main()
{
	LuaStateOwner state;
	state->DoFile("test.lua");

	LuaFunction<float> luaAdd =  state->GetGlobal("Add");
	float i = luaAdd(1.1f,1.0f);
	cout<<"Lua 内部函數傳回 = "<<i<<endl;

	return 0;
}
           

     還有一種方法,直接用DoString語句調用。

#include <iostream>
using namespace std;
#include "..\..\LuaPlus\src\LuaPlus\LuaPlus.h"

#define LUA_OK 0

int main()
{
	LuaStateOwner state;
	state->DoFile("test.lua")
	state->DoString("print(Add(3,4))");
	return 0;
}
           

結果是一樣的。

3)C++函數被Lua腳本内的函數執行。

   這個調用就有點意思了,在Lua腳本裡可以這麼寫

function Add(x, y) 
      PrintNumber(x,y); 
end
           

也就是Add函數調用了一個名字叫PrintNumber()的函數。而這個PrintNumber函數在哪裡呢?讓我們看看C++代碼

#include <iostream>

using namespace std;
#include "..\..\LuaPlus\src\LuaPlus\LuaPlus.h"

#define LUA_OK 0

void  Show(int x,int y) {cout<<"x+y="<<x+y<<endl;}

int main()
{
	LuaStateOwner state;
	state->DoFile("test.lua");
	state->GetGlobals().RegisterDirect("PrintNumber", Show);
	state->DoString("Add(3,4)");
	return 0;
}
           

原來PrintNumber隻是一個中間字元串,他指向了C++函數Show();

繼續閱讀