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







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