C++与lua交互
项目开发的脚本层用的是Lua,引擎用的是C++。但是经理不给开放引擎层的代码。刚好最近项目空闲,安排了学习C++跟Lua的通信。
一、C++与Lua数据交互
数据交互主要是通过C API来实现
首先,要加入Lua的头文件
extern "C" {
#include "lua.h"
#include "lualib.h"
#include "lauxlib"
}
也可以用#include "lua.hpp"代替
要使用的lua文件为:test.lua,其中有个变量a = 1
1.创建一个Lua虚拟机;
lua_State *L;
L=lua_open();
链接lua库
luaL_openlibs(L);
早期版本可能得一个个加载。
2.导入lua文件
luaL_dofile(L,"test.lua");
3.获取想要的lua变量:a
lua_getglobal(L,"a");
int b = (int)lua_tonumber(L,-1);
cout<<b<<endl;
这样就获取了test.lua中的变量a.
C++与Lua的之间函数的相互调用
1.C++调Lua函数
C与lua的所有交互都是通过一个栈来完成的。我对前面提到的虚拟机L的理解是,它就是一个栈(可能理解的不对)。然后通过对这个栈的操作来实现数据的交互。
调用函数跟访问变量其实差不多,前面都是做一样的事,只是调用函数时获取的变量是函数名。然后将需要的参数逐一入栈,最好通过lua_call来调用函数。具体实现如下。
********test.lua*************
function add(x,y)
return x+y
end
******************************
int main(int argc,char *argv[])
{
int ret;
int x = 1;
int y = 2;
lua_State *L = lua_open();
luaL_openlibs(L);
luaL_dofile(L);
lua_getglobal(L,"add"); //将函数入栈
lua_pushnumber(L,x); //变量x入栈
lua_pushnumber(L,y); //变量y入栈
lua_call(L,2,1) //2表示参数个数,1表示函数返回值的个数。因为lua可以返回多个值。 我的理解是将x,y出栈,计算函数值,并将函数值入栈。这时,函数值就在栈顶。
ret = lua_tonumber(L,-1) //获取栈顶元素,并出栈。-1表示对栈顶的偏移量为1。负数时对栈顶的偏移量,正数是对栈底的偏移量。如果返回的是字符串就用lua_tostring。
lua_pop(L,1); //将函数出栈
lua_close(L);
return 0;
}
2.Lua调C++函数
lua要调用C的函数需要将C函数注册到lua中。
int add(lua_State *L)
{
double sum = 0;
sum = lua_tonumber(L,-1) + lua_tonumber(L,-2); //取栈顶两元素,并相加
lua_pushnumber(L,sum); //将结果返回给lua
return 0;
}
int main(int argc,char *argv[])
{
lua_State *L = lua_open();
luaL_openlibs(L);
lua_register(L,"_add",add); //向lua注册C函数,第二个参数是lua中的函数名,第三个参数是C的函数名。
luaL_dofile(L,"luaandc.lua"); //执行lua文件
return 0;
}
C++与lua交互的更多相关文章
- C++与Lua交互(四)
引言 通过前几篇,我们已经对Lua的C API有了一定的了解,如lua_push*.lua_is*.lua_to*等等.用C++调用Lua数据时,我们主要运用lua_getglobal与lua_pus ...
- C++与Lua交互(一)
引言 之前做手游项目时,客户端用lua做脚本,基本所有游戏逻辑都用它完成,玩起来有点不爽,感觉"太重"了.而我又比较偏服务端这边(仅有C++),所以热情不高.最近,加入了一个端游项 ...
- C++与Lua交互之配置&交互原理&示例
|Lua 简介 Lua 是一种轻量小巧的脚本语言,也是号称性能最高的脚本语言,它用C语言编写并以源代码形式开放. 某些程序常常需要修改内容,而修改的内容不仅仅是数据,更要修改很多函数的行为. 而修改函 ...
- C++与Lua交互(三)
通过上一篇的热身,我们对C++调用lua变量有了一个认识,现在让我们再深入一点,去探索一下如何调用lua的函数.表. Lua与宿主通讯的关键--栈 lua是个动态脚本语言,它的数据类型如何映射到C++ ...
- C++与Lua交互(二)
上一篇我们搭建好了整个的项目环境,现在,我们一起探索一下如何将lua寄宿到C++中. 宿主的实现 我们在LuaWithCPPTest项目下,查看Source.cpp代码如下: #include < ...
- 最优雅的C++跟lua交互.
我先来吐槽一下我们这个项目. 我是做手机游戏的, cocos2dx引擎, lua编码. 这本来是一件很欢快的事情, 因为不用接触C++. C++写久了的人写lua, 就会感觉任督二脉被打通了, 代码写 ...
- Linux下C/C++和lua交互-Table
本来这些文章都是在我的个人网站www.zhangyi.studio,目前处在备案状态,暂时访问不了,所以搬到这边. 最近这两天需要弄清楚C++和lua间相互调用和数据传递,废话不多说,直接上过程. ...
- Cocos 2d-X Lua 游戏添加苹果内购(二) OC和Lua交互代码详解
这是第二篇 Cocos 2d-X Lua 游戏添加苹果内购(一) 图文详解准备流程 这是前面的第一篇,详细的说明了怎样添加内购项目以及填写银行信息提交以及沙盒测试员的添加使用以及需要我们注意的东西,结 ...
- 教程二 网页和lua交互修改openwrt
硬件 http://zhan.renren.com/h5/entry/3602888498044209332 GL-iNet 1 首先安装 webserver之lighttpd ,openwrt自带 ...
随机推荐
- hdu1074 Doing Homework(状态压缩DP Y=Y)
Doing Homework Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) T ...
- JAVA - hashcode与equals作用、关系
Hashcode的作用 总的来说,Java中的集合(Collection)有两类,一类是List,再有一类是Set.前者集合内的元素是有序的,元素可以重复:后者元素无序,但元素不可重复. ...
- codevs 2451 互不侵犯(状丫dp)
/* 好神奇好神奇...表示自己要学的还很多 注意到n<=9 不是搜索就是状丫 搜索+剪枝 70分 枚举放或者不放 这里用状丫 f[i][j][k] 表示前i行 放了j个国王 i行的状态是k的方 ...
- C#中如何获取系统环境变量等
C#中获取系统环境变量需要用到Environment 类. 其中提供了有关当前环境和平台的信息以及操作它们的方法.该类不能被继承 以下代码得到%systemdrive%的值,即“C:” string ...
- 开源CMS建站项目DNN研究与心得
DNN (Dotnetnuke) 首先是开源的,并且采用BSD开源协议,也就是说你可以任意修改源代码.传播.作为商品出售,仅有的要求就是保留源代码中的版权文字,这就解决了我多年来的心病:我知道动网新闻 ...
- 图文教程:手把手教你用U盘安装Ubuntu
说到ubuntu,有接触linux的童鞋都应该听过,用wubi安装只是像在电脑上安装一个软件,可以轻松体验ubuntu,不过毕竟性能会打折扣,所以本人是比较喜欢直接安装在硬盘上的. 这种方法只适合用d ...
- JS实现定时器(类似工行网银支付限时操作)
js脚本内容: //5秒倒计时 var num = 0 ; var max = 5 ; var id = null ; id = setInterval(box , 1000) ; //1秒钟调用 ...
- display:inline,display:inline-block,display:block 区别
之前一直迷惑于display:inline/inline-block/block的异同,在度娘谷哥的帮助下,突然有了一点思路. 按照网上的介绍,inline将对象转化为内联元素,block将对象转化为 ...
- Sql Server索引(转载)
官方说法: 聚集索引 一种索引,该索引中键值的逻辑顺序决定了表中相应行的物理顺序. 聚集索引确定表中数据的物理顺序.聚集索引类似于电话簿,后者按姓氏排列数据.由于聚集索引规定数据在表中的物理存储顺序, ...
- C#中串口与Modem的通信
C#中串口与Modem的通信 2007-08-20 09:52643人阅读评论(8)收藏举报 最近一段时间,试验了串口的数据传输.在C#中,其实有一个很好的类SerialPort使串口间的通信变得简单 ...