天天看点

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

继续阅读