C++与lua交互】的更多相关文章

引言 通过前几篇,我们已经对Lua的C API有了一定的了解,如lua_push*.lua_is*.lua_to*等等.用C++调用Lua数据时,我们主要运用lua_getglobal与lua_push*配合以达到目的.现在我们来试试用Lua调用C++数据. C++数据类型映射到Lua C++中数据类型有这么几种:1.内建的int.float等:2.指针,如void *.int *.int (*fun)(int, int)等:3.用户自定义的class.strcut等.Lua中C API支持操作…
引言 之前做手游项目时,客户端用lua做脚本,基本所有游戏逻辑都用它完成,玩起来有点不爽,感觉"太重"了.而我又比较偏服务端这边(仅有C++),所以热情不高.最近,加入了一个端游项目,客户端和服务器都用了lua,各种玩法是让我眼界大开.在此,写下自己的心得与体会,希望能与大家共同探讨进步. 环境搭建 lua官网下载lua源代码,我们将用它来编译静态库,解释器,以及动态库. CMake官网下载最新的安装包,我们将用它来作为搭建solution的工具. 集成开发环境为VS2012,整个的编…
|Lua 简介 Lua 是一种轻量小巧的脚本语言,也是号称性能最高的脚本语言,它用C语言编写并以源代码形式开放. 某些程序常常需要修改内容,而修改的内容不仅仅是数据,更要修改很多函数的行为. 而修改函数行为这种事,很难用简单的更改数据的方式来实现,若在源代码层面上改又得重新编译生成,导致修改成本高. 而脚本语言先通过更改数据,并加了一层对数据解释成运行代码的步骤,从而使程序能在运行时更改复杂的函数行为而无需重新编译. 它为程序大大地提供了灵活的扩展和定制功能,减少了修改的成本. 而游戏程序往往会…
通过上一篇的热身,我们对C++调用lua变量有了一个认识,现在让我们再深入一点,去探索一下如何调用lua的函数.表. Lua与宿主通讯的关键--栈 lua是个动态脚本语言,它的数据类型如何映射到C++这种静态类型语言中?lua是有GC机制的,这与C++手动管理内存相悖.如何解决这些问题呢?lua用一个抽象的栈与宿主语言交互,栈中的每一条记录都可以保存lua值.无论何时,我们想要从lua请求一个值,调用lua,被请求的值将会被压入栈. 栈是由lua来管理的,垃圾回收器知道哪个值正在被C使用(如果从…
上一篇我们搭建好了整个的项目环境,现在,我们一起探索一下如何将lua寄宿到C++中. 宿主的实现 我们在LuaWithCPPTest项目下,查看Source.cpp代码如下: #include <iostream> #include <fstream> #include <string> using namespace std;   extern "C" { #include <lua.h> #include <lauxlib.h&…
我先来吐槽一下我们这个项目. 我是做手机游戏的, cocos2dx引擎, lua编码. 这本来是一件很欢快的事情, 因为不用接触C++. C++写久了的人写lua, 就会感觉任督二脉被打通了, 代码写起来都不用太多考虑, 就像涉世太深的人吹起牛逼肆无忌惮, 总是可以自圆其说. 然而, 事与愿违, 我们客户端的兄弟仍然要编写大量C++代码, 其原因是, 配置文件, 数据结构统统由后端决定, 而后端没有人会lua, 因此数据全部放在C++, 客户端每一次存取数据都会接触到C++. 然后, 就出现了今…
项目开发的脚本层用的是Lua,引擎用的是C++.但是经理不给开放引擎层的代码.刚好最近项目空闲,安排了学习C++跟Lua的通信. 一.C++与Lua数据交互 数据交互主要是通过C API来实现 首先,要加入Lua的头文件 extern "C" { #include "lua.h" #include "lualib.h" #include "lauxlib" } 也可以用#include "lua.hpp"代…
本来这些文章都是在我的个人网站www.zhangyi.studio,目前处在备案状态,暂时访问不了,所以搬到这边.  最近这两天需要弄清楚C++和lua间相互调用和数据传递,废话不多说,直接上过程. 首先是环境环境,Linux(Debian),安装lua,注意需要管理员权限. 安装完后输入lua或者lua -v 严重是否安装成功以及安装的版本,当然,有了lua运行环境还不够我们还需要安装lua开发库既然我们安装的是lua5.2那么开发库同样安装成5.2版本,命令如下: -dev 当然,lua的环…
这是第二篇 Cocos 2d-X Lua 游戏添加苹果内购(一) 图文详解准备流程 这是前面的第一篇,详细的说明了怎样添加内购项目以及填写银行信息提交以及沙盒测试员的添加使用以及需要我们注意的东西,结果,被移除首页了!前面第一篇的内容是这篇的基础,前面那些不弄好,下面的商品信息你是请求不到的,这点需要大家特别注意...有需要前面提到的内容的孩子可以点击链接进去自己看看!! 这篇就具体的总结我们Lua和OC交互的内容以及内购具体的代码以及结果的测试说明: 内购部分OC的代码实现 先自己总结一下整个…
硬件 http://zhan.renren.com/h5/entry/3602888498044209332 GL-iNet 1 首先安装 webserver之lighttpd  ,openwrt自带的是uhttpd http://www.voidcn.com/article/p-zqbwgqwy-vy.html 1-1安装过程简略 1-2配置 Lighttpd默认页面 http://localhost/index.lighttpd.html 写lighttpd的配置文件lighttpd.con…
重点文章: 1.[Unity3D]Unity3D游戏开发之Lua与游戏的不解之缘(上) 2.[Unity3D]Unity3D游戏开发之Lua与游戏的不解之缘(中) 3.Lua和C++交互详细总结 4.LuaInterface简介 5.不同版本Lua介绍 6. C#与Lua相互调用 7.在Unity中使用Lua脚本:语言层和游戏逻辑粘合层处理 8.Unity3D 预备知识:C#与Lua相互调用 9. Lua for Windows 开始学习Lua编程 10.腾讯开源手游热更新方案,Unity3D下…
Windos2010编译lua的方法: http://blog.csdn.net/appletreesujie/article/details/12065369 Linux编译lua的方法: make linux make install 做完上面的工作之后,就可以用lua 脚本名,举例如下: [roo@123]# lua my.lua gcc -I/usr/local/include/ -L/usr/local/lib/ -lm add.c -o add /usr/local/lib/libl…
引言 要将C++中的对象类型映射到Lua中,就不得不要先了解Lua面向对象的机制.在这里,我们先看一下Lua面向对象的实现基础--metatable,再以此实现C++对象到Lua的映射. Lua面向对象 不得不先提一下Lua的几种函数写法,普通函数有两种写法:   如果要将一个普通函数赋给一个表,有如下写法: 如果函数里面需要引用表的值,有两种写法: 其中,第二种写法就是一种面向对象的写法了,它隐藏了第一个参数:self.我们还有另一种调用该函数的方式,即通过显示的传递self参数的形式: 至此…
话接上篇.通过前几篇博客,我们实现在Lua脚本中执行Qt类中函数的方法,以及在Lua脚本中连接Qt对象的信号与槽. 但是,我们也能发现,如果希望在Lua脚本中执行Qt类的函数,就必须绑定一个真正实现功能的函数.如QWidget::show(),需要写一个在栈中取出widget指针,widget调用show()函数的方式.如果希望在Lua中调用大量函数,就需要编写大量的C++实现函数.有没有什么省时省力的好方法呢? 上一篇中我们实现了在Lua脚本中连接信号与槽.我们只是传过去了两个QObject的…
话接上文.笔者为了方便使用Lua,自己编写了一个Lua的类.主要代码如下: QLua.h #ifndef QLUA_H #define QLUA_H // own #include "include/lua.hpp" // qt #include <QObject> #include <QFile> #include <QDebug> #include <QWidget> #include <QLineEdit> #inclu…
话接上篇.成功配置好Qt+Lua+toLua后,我们可以实现在Lua脚本中使用各个Qt的类.直接看代码吧. #include "include/lua.hpp" #include <QWidget> #include <QApplication> #include <QFile> #include <QDebug> static int tolua_new_QWidget(lua_State* pState) { QWidget* wid…
偶然间看到Lua这种脚本语言,有点兴趣,简单学习了一下. 发现Lua与C++之间可以实现非常强的交互性.Lua中可以使用C++中的函数,C++中也可以使用Lua中的函数.由此可以引发出很多奇思妙想了. 简单来说,Lua动态的特性补充了C++的功能.当然,也看你具体怎么用. 笔者经常使用Qt,故准备将Qt和Lua结合在一起.想象一下在Lua脚本中调用如下代码: w = QWidget:new() w:show() 然后弹出一QWidget的窗口,是多么感人的一件事情呀. 好,下面开始配置环境吧.…
Lua与C++之间可以实现非常强的交互性.Lua中可以使用C++中的函数,C++中也可以使用Lua中的函数.由此可以引发出很多奇思妙想了. 简单来说,Lua动态的特性补充了C++的功能.当然,也看你具体怎么用. 笔者经常使用Qt,故准备将Qt和Lua结合在一起.想象一下在Lua脚本中调用如下代码: w = QWidget:new() w:show() 然后弹出一QWidget的窗口,是多么感人的一件事情呀. 好,下面开始配置环境吧. 1. 下载Lua 5.1.目前的最新版本是5.2,但是因为使用…
使用tolua++将自定义的C++类嵌入,让lua脚本使用 一般过程: 自定义类 -> 使用tolua++工具编译到LuaCoco2d.cpp中 -> lua调用 步骤一:自定义一个C++类,我定义一个类名为:MySprite MySprite.h MySprite.cpp 步骤二:根据自定义类创建一个.pkg文件,我们把自定义的MySprite类定义到.pkg文件中 注意:1>,只要根据自定类.h中的内容,至于.cpp的实现,binding后lua会自动调用类的函数 2>,书写.…
如果是c#代码出错了 [MonoPInvokeCallbackAttribute(typeof(LuaCSFunction))] static int _g_get_down(RealStatePtr L) { try { ObjectTranslator translator = ObjectTranslatorPool.Instance.Find(L); translator.PushUnityEngineVector3(L, UnityEngine.Vector3.down); } cat…
用lua就表示项目用到了热更新,通常每次热更新都会从服务器获取最新的lua脚本放到Android/ios设备的本地目录下,但是lua应该放到哪个目录下呢,这里就先说说lua里面的路径问题 1.不可以放到Resources文件夹下,因为无法找到其在设备下的位置,Resources下的东西是由unity来管理的,使用的时候通过Resources.load/loadAll来加载,而且后缀为lua的文件,无法通过Resources来加载 2.不可以放到StreamingAssets文件夹,因为在设备下S…
编译C程序中有与Lua有关的程序(编译环境是Linux系统,lua解释器是luajit)gcc -o test30 test30.cpp -I/usr/local/include/luajit-2.0/ -L/usr/local/lib/ -lluajit-5.1 cp power.so /home/yuhua/frame_exec/lib/ gcc -o power.so hellolua.c -shared -fPIC -I/usr/local/include/luajit-2.0/ -L/…
0 预备知识: 至少对Lua手册C API有简单的了解.lua5.3手册中文 1  Lua虚拟机的栈,如图: 假设虚拟机的栈有n个数据: 解释: 两种解释方式: A,栈顶开始, -1 ...-n B,栈底开始,1 ...n 二.运行原理和调用栈机制实例 创建main.lua function LuaFunc(a) return +a,,,; end C++ //①新建虚拟机 lua_State* L = luaL_newstate(); //②载入库 luaL_openlibs(L); //③这…
假设lua中: name="gzw" id=17010805 sex=man tab={ num=100, str="hello" } foo_one=function() print("不带参数的foo()被调用了") end foo_two=function(num) print("num=",num) return num end 接下来要在C++中调用lua. 首先看调用全局变量: int main() { lua_S…
Lua可作为扩展性语言(Lua可以作为程序库用来扩展应用的功能),同时也是个可扩展的语言(Lua程序中可以注册由其他语言实现的函数). C和Lua交互的部分称为C API.C API是一个C代码与Lua进行交互的函数集.他由以下部分组成:读写Lua全局变量的函数.调用Lua函数的函数.运行Lua代码片断的函数.注册C函数然后可以在Lua中被调用的函数,等等. API中有些函数为了方便以宏的方式实现. 当在Lua和C之间交换数据时我们面临着两个问题:动态与静态类型系统的不匹配和自动与手动内存管理的…
通常来说,C函数需要保留一些非局部的数据,也就是指那些超过他们作用范围的数据.C语言中我们使用全局变量或者static变量来满足这种需要.然而当你为Lua设计一个程序库的时候,全局变量和static变量不是一个好的方法.首先,不能将所有的Lua值保存到一个C变量中.第二,使用这种变量的库不能在多个Lua状态的情况下使用. 一个替代的解决方案是将这些值保存到一个Lua全局变两种,这种方法解决了前面的两个问题.Lua全局变量可以存放任何类型的Lua值,并且每一个独立的状态都有他自己独立的全局变量集.…
最近在写一个项目,前端技术使用的是Vue,在与lua的交互过程,是通过一个公共JS,前端调用公共js的方法给lua发送命令,lua接到命令,去执行一些方法,然后又通过回调返回到了前端,由于是第一次写这样的项目,遇到了一些坑,总结下. 1.提示 null is not an Object (evaluating 'this.msgList') 在解析Vue中的数据的时候,在回调函数中,this的指向丢失,导致报错,最终采用了箭头函数的方法来解决了这个问题 2. null is not an Obj…
lua是一种嵌入式的语言,首先安装. lua安装依赖于readline库,下载readline tar -zxvf readline-6.2.tar.gz cd readline-6.2 ./configure make && make installl 然后解压lua make linux test 完成之后,在src目录下,执行lua,打开终端 输入print('hello world') 就安装完成了 退出终端可以执行os.exit() 接下来执行一个简单的程序 -- defines…
catalog . Lua语言简介 . 使用 Lua 编写可嵌入式脚本 . VS2010编译Lua . 嵌入和扩展: C/C++中执行Lua脚本 . 将C++函数导出到Lua引擎中: 在Lua脚本中执行C++函数 . 将C函数导出到Lua引擎中: 在Lua脚本中执行C函数 . C++ Function Library For Lua . Lua.Python嵌入式语言引擎的优缺点对比 1. Lua语言简介 0x1: 运行 Lua是类C的,所以,他是大小写字符敏感的,同时,Lua脚本的语句的分号是…
导出 C/C++ API 给 Lua 使用   cocos2d-x 和 quick-cocos2d-x 的底层代码都是使用 C++ 语言开发的.为了使用 Lua 脚本语言进行开发,我们利用 tolua++ 工具,将大量的 C/C++ API 导出到了 Lua 中. 使用 tolua++ 的基本步骤: 从 C/C++ 源代码复制头文件的内容到 .tolua(tolua++ 文档中称为 .pkg)文件中. 修改 .tolua 文件内容,去掉 tolua++ 无法识别的内容,以及不需要导出到 Lua…