LuaPlus新手使用方法(转)

  看大家都在研究lua,也参与大潮中。。。折腾半天没折腾好,相当的无语时候,网上找的资料都是你抄写我,我抄袭他的。。

      郁闷,只要边抄袭边修改,最后测试成功,整理一个完整的资料发表下。再次感谢“雪明”与一个不知名的网友文章,不知道原作者,也就不发链接了。

如何编译

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

      用vs2005打开LuaPlus.vs2005.vcproj默认加载以后,选择release模式编译。。会在http://www.cnblogs.com/lib/win32生成库lib文件LuaPlus_1100.lib与http://www.cnblogs.com/Bin目录生成LuaPlus_1100.dll.

     新建一个工程文件.来测试.将LuaPlus_1100.dll,LuaPlus_1100.lib拷贝到目录下。

#include <stdio.h>

--------------------------------------------------------------------------------------------------------------------------
#include "F:\程序源码\visual C++ code\lua\LuaPlus51_Build1100\Src\LuaPlus\luaPlus.h"   //luaPlus头文件
#pragma comment(lib,"LuaPlus_1100.lib")                                                                       //库文件
using namespace LuaPlus;

 

--------------------------------------------------------------------------------------------------------------------------

void main()
{
LuaStateOwner state;

int iret = state->DoFile("test.lua");

int mytest = state->GetGlobal("health").GetInteger();
LuaFunction <float> Add = state->GetGlobal("Add");
float myRet = Add(3.14f,5.25f);

getchar();
}

注意

healtth = 100;

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

这样是错误的,当有语法错误时候,会导致DoFile返回值为1.即返回错误。

测试结果,有一个问题DoString("print('不显示???')");执行以后并没有打印。。

测试成功以后,在D盘新建sdk\luaplus目录

目录下新建include与lib文件夹,将luaplus/src目录下的文件拷贝到include目录,将lib库文件拷贝到lib目录。

修改头文件包含信息,编译出来的文件需要打包带上LuaPlus_1100.dll文件。

--------------------------------------------------------------------------------------------------------------------------

#include <LuaPlus.h>
#pragma comment(lib,"LuaPlus_1100.lib")
using namespace LuaPlus;

--------------------------------------------------------------------------------------------------------------------------

下面发一下转载的用法:

如何使用

接着讲讲如何在你的其他项目中使用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++中的这个函数.


posted @ 2010-12-12 09:11  oayx  阅读(6308)  评论(0编辑  收藏  举报