[原创]LuaPlus上手指南(1)

news/2024/7/6 13:42:42
  [原创]LuaPlus上手指南(1)

LuaPlus上手指南(1)

 

 

版权所有,转载请注明出处,勿用于商业用途,谢谢!

作者:    大宝天天见

Blog:    http://www.cppblog.com/singohgod

本人水平有限,有错请指出,欢迎交流,共同进步!

 

国内关于Lua的资料实在是太少,为了寻找一个合适的LuaC++封装,真是如同大海捞针.在看了众多资料后锁定以下几种: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


http://www.niftyadmin.cn/n/4819448.html

相关文章

把当前web页面上的所有图片复制到特定目录

把当前web页面上的所有图片复制到特定目录,比如C:/imgs/ 转载请注明:作者:糯米糊糊(huyoo353),来源:http://blog.csdn.net/huyoo/ MoreQuick回复: thank,我也不是很精通这方面,不过插件可以用vbscript写的 麻烦你贴代码到论坛上,看是否有人会 thanks! -- Previous Private …

糯米糊糊4

最近在给单位做网站&#xff0c;目前根据网上流行的什么福娃许愿树&#xff0c;改出来一个留言本&#xff0c;使用了Elook留言本的图像资源。 不知道要不要给大家共享一下我的糯米糊糊留言本源码&#xff1f;

如何在C++中集成Lua脚本(LuaPlus篇)

如何在C中集成Lua脚本(LuaPlus篇)去年我作了一个Lua脚本的C包装&#xff0c;有许多朋友感兴趣&#xff0c;并尝试使用&#xff0c;我感到受宠若惊。事实上&#xff0c;我作的包装&#xff0c;学习的目的比较强&#xff0c;它还是有许多缺陷的。为了让朋友们少走弯路&#xff0c…

[整理]虚拟继承入门

[整理]虚拟继承入门 这次失业之后&#xff0c;突然发现现在工作好像真的不是很好找&#xff0c;没办法&#xff0c;主动权不在自己手里&#xff0c;静下心来想想就当通过笔试来给自己查漏补缺吧&#xff0c;昨天笔试遇到一个虚拟继承的概念&#xff0c;这不虽说2分的题&#x…

使用同步对象编程

3 使用同步对象来编程 本章定义了四种可用的同步类型&#xff0c;并且讨论实现同步的注意事项。 互斥锁&#xff08;mutex&#xff09; 条件变量(condition variable) 多读单写锁(multi-read,single-write lock) 信号量(semophore) 进程间同步(process synchronization) 同步原…

深入研究 C++中的 STL Deque 容器(一)

本文档深入分析了std::deque&#xff0c;并提供了一个指导思想&#xff1a;当考虑到内存分配和执行性能的时候&#xff0c;使用std::deque要比std::vector好。  介绍   本文深入地研究了std::deque 容器。本文将讨论在一些情况下使用deque> 比vector更好。读完这篇文章后…

如何在htmlview中触发页面中的按钮?

http://www.softwelt.com/Know/KnowDetail-3741596.html如何在htmlview中触发页面中的按钮?请问&#xff1a; 如何在HTMLVIEW中触发页面中的按钮&#xff1f; 如何能够知道用户点击了页面中的按钮。 如有方法能够达到相同的目的我也给分。 帮忙推者也有分。 提问时间&#xff…

leetcode36 有效数独

问题描述判断一个 9x9 的数独是否有效。需要满足三个条件&#xff1a;1.  数字 1-9 在每一行只能出现一次 2.  数字 1-9 在每一列只能出现一次 3.  数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。 解决思路前两个要求比较容易好解决&#xff0c;对每行、列的数…