版权所有, 转载请注明出处, 勿用于商业用途, 谢谢!
作者: 大宝天天见
Blog: http://www.cppblog.com/singohgod
本人水平有限, 有错请指出, 欢迎交流, 共同进步!
国内关于 Lua 的资料实在是太少 , 为了寻找一个合适的 Lua 的 C++ 封装 , 真是如同大海捞针 . 在看了众多资料后锁定以下几种 :LuaBind ToLua++ LuaPlus. 在选择上颇有讽刺的味道 ,LuaBind 的版本号还没到 1.0, 加上网友颇有微词 , 放弃 .ToLua++ 本来有朋友推荐 , 但是怎么都找不到下载 , 官网就是打不开 , 无赖放弃 . 就只有 LuaPlus 了 , 看到一些人的评价还行 , 于是决定就用它吧 .
LuaPlus 的资料就更少了 , 连怎么配置怎么调试等什么都没有 , 只有沐枫大哥讲解了语法方面的一篇文章 . 啊哟 , 怎么搞呢 , 难道又只有硬着头皮上了 ?( 某伟人曾说过 , 但凡杰出的事都是硬着头皮干出来滴 )
好了 , 言归正传 , 下面讲讲我的经验吧 :
如何编译
1. 下载
首先到官方网站下载 : http://www.luaplus.org/
下载这个 : All source code: http://luaplus.org/LuaPlus51_Build1100.zip ( 我当前的版本 , 当然越新越好 )
2. 剥离
解开下载包 , 打开 /LuaPlus51_Build1100/Src/LuaPlus 里面是全部源文件 ,src 下是 lua 的源文件 . 这里有个令人疑惑的地方 , 源文件中带了一些不需要的文件 , 要剔除去 , 基本上需要以下这些文件 :
1) Lua 库文件 :
lapi.c lapi.h lauxlib.c lauxlib.h lbaselib.c lcode.c lcode.h ldblib.c ldebug.c ldebug.h ldo.c ldo.h ldump.c lfunc.c lfunc.h lgc.c lgc.h linit.c | liolib.c llex.c llex.h llimits.h lmathlib.c lmem.c lmem.h loadlib.c lobject.c lobject.h lopcodes.c lopcodes.h loslib.c lparser.c lparser.h lstate.c lstate.h lstring.c | lstring.h lstrlib.c ltable.c ltable.h ltablib.c ltm.c ltm.h lua.h luaconf.h lualib.h lundump.c lundump.h lvm.c lvm.h lzio.c lzio.h print.c |
2) LuaPlus 头文件 :
auxiliar.h LuaAutoBlock.h LuaCall.h LuaFunction.h LuaHelper.h LuaHelper_Object.h LuaHelper_StackObject.h LuaLink.h LuaObject.h LuaObject.inl LuaPlus.h LuaPlusCD.h | LuaPlusFunctions.h LuaPlusInternal.h LuaStackObject.h LuaStackObject.inl LuaStackTableIterator.h LuaState.h LuaState.inl LuaStateOutFile.h LuaTableIterator.h luathread.h pt.h srm.h |
3) LuaPlus 源文件
LuaCall.cpp LuaObject.cpp LuaPlus.cpp LuaPlusAddons.c LuaPlusFunctions.cpp LuaPlus_Libs.cpp LuaStackObject.cpp | LuaStackTableIterator.cpp LuaState.cpp LuaStateOutFile.cpp LuaState_DumpObject.cpp LuaTableIterator.cpp lwstrlib.c |
3. 建立项目
然后你就可以在 VS 中建立一个新项目 , 静态链接库的 :
分别把需要的文件加进去 , 之后编译 , 应该能通过了 .
如何使用
接着讲讲如何在你的其他项目中使用 LuaPlus.
1. 必要的配置
你的项目可能是这样的 :
设置 GameClient 的依赖项是 LuaPlusLib
#include "LuaPlus.h"
using namespace LuaPlus;
记得干这事 …
2. 创建一个状态
LuaStateOwner state;
今后的操作都围绕这个 state
3. 执行脚本
int iret = state->DoFile("test.lua");
返回值为 0 表示成功 , 否则不成功 .
4.C++ 中获取 Lua 脚本的变量
假设你的 test.lua 中有 :
health = 200;
通过下列方法就可以在 C++ 中得到这个数值
int mytest = state->GetGlobal("health").GetInteger();
5.C++ 中调用 Lua 脚本里的函数
假设你的 test.lua 中有 :
function Add(x, y)
return x+y;
end
在 C++ 中需要先声明这个函数 :
LuaFunction<float> Add = state->GetGlobal("Add");
这样你就有了 Add() 这个函数 , 然后就可以像平常一样使用它了 :
float myret = Add(3.14f,5.25f);
6.Lua 脚本中调用 C++ 函数
在读取 test.lua 之前要先把 C++ 函数注册到 Lua 的运行时栈里 , 这样在执行 lua 脚本的时候 , 才知道执行哪一个函数 :
首先有函数 :
int LS_PrintNumber(LuaState* state)
{
LuaStack args(state);
if (args[1].IsNumber()) {
printf("%f/n", args[1].GetNumber());
}
return 0;
}
然后注册这个函数到 Lua:
state->GetGlobals().Register("PrintNumber", LS_PrintNumber);
这样就把 LS_PrintNumber 映射为 Lua 中可以使用的函数 PrintNumber.
Test.lua 脚本中添加调用语句 :
PrintNumber(30);
当 state->DoFile("test.lua"); 执行的时候 , 就执行了 C++ 中的这个函数 .
总结
本文介绍了 LuaPlus 的基本配置方法和使用 , 希望对你有帮助 . 下一篇将介绍一些高级特性 , 如怎样在 VS 中调试 LuaPlus 的脚本 , 以及对类的操作等 .
如果还有任何疑问可以看看下面这个简单的例子:
/Files/singohgod/LuaPlus_Test.rar