Lua脚本和C++交互(二)

上一节讲了一些基本的Lua应用,下面,我要强调一下,Lua的栈的一些概念,因为这个确实很重要,你会经常用到。熟练使用Lua,最重要的就是要时刻知道什么时候栈里面的数据是什么顺序,都是什么。如果你能熟练知道这些,实际你已经是Lua运用的高手了。当你初始化一个栈的时候,它的栈底是1,而栈顶相对位置是-1,说形象一些,你可以把栈想象成一个环,有一个指针标记当前位置,如果-1,就是当前栈顶,如果是-2就是当前栈顶前面一个参数的位置。以此类推。当然,你也可以正序去取,这里要注意,对于Lua的很多API,下标是从1开始的。这个和C++有些不同。而且,在栈的下标中,正数表示绝对栈底的下标,负数表示相对栈顶的相对地址,这个一定要有清晰的概念,否则很容易看晕了。(栈中数据的存储方式如下图)

注:其实都是从栈底到栈顶,索引数值递增

下面看一些具体的例子:

lua_pushnumber(m_pState, 11);
lua_pushnumber(m_pState, 12);

// lua_gettop()这个API是告诉你目前栈里元素的个数
int nIn = lua_gettop(m_pState)

int nData1 = lua_tonumber(m_pState, 1);     //读取栈底第一个绝对坐标中的元素
int nData2 = lua_tonumber(m_pState, 2);     //读取栈底第二个绝对坐标中的元素
int nData3 = lua_tonumber(m_pState, -1);     //读取栈顶第一个相对坐标中的元素
int nData4 = lua_tonumber(m_pState, -2);     //读取栈顶第二个相对坐标中的元素

printf("[Test]nData1  = %d, nData2  = %d./n, nData3  = %d, nData4  = %d./n");
[Test]nData1  = 11, nData2  = 12, nData3  = 12, nData4  = 11

上述代码的栈中存储如下图:

时间: 2024-08-29 20:03:35

Lua脚本和C++交互(二)的相关文章

Lua脚本和C++交互(一)

现在,越来越多的C++服务器和客户端融入了脚本的支持,尤其在网游领域,脚本语言已经渗透到了方方面面,比如你可以在你的客户端增加一个脚本,这个脚本将会帮你在界面上显示新的数据,亦或帮你完成某些任务,亦或帮你查看别的玩家或者NPC的状态...如此等等. 但是我觉得,其实脚本语言与C++的结合,远远比你在游戏中看到的特效要来的迅猛.它可以运用到方方面面的领域,比如你最常见的应用领域.比如,你可以用文本编辑器,写一个脚本语言,然后用你的程序加载一下,就会产生出很绚丽的界面.亦或一两句文本语言,就会让你的

Lua脚本和C++交互(四)

上一篇中,你已经可以在Lua里面用C++的函数了,那么咱们再增加一点难度,比如,我有一个CTest对象,要作为一个参数,传输给func_Add()执行,怎么办?很简单,如果你对上面的代码仔细阅读,你会发现下面的代码一样简洁.为了支持刚才要说的需求,我们需要把Sample.lua再做一点修改. function func_Add(x, y, f) -- New了一个CTest对象,并进行赋值操作,最后把结果打印在屏幕上 -- local test = CTest:new() -- test:Set

Lua脚本和C++交互(三)

前两篇文章中介绍了C++调用lua.lua栈操作的一些相关知识. 下面说一下Lua的工具.我们下一步要用到其中的一个帮助我们的开发,其实,Lua里面有很多简化开发的工具,你可以去www.sourceforge.net去找一下.它们能够帮助你简化C++对象与Lua对象互转之间的代码.这里说几个有名的,当然可能不全. (lua tinker)如果你的系统在windows下,而且不考虑移植,那么我强烈推荐你去下载一个叫做lua tinker的小工具,整个工具非常简单,一个.h和一个.cpp.直接就可以

Win32下 Qt与Lua交互使用(二):在Lua脚本中使用Qt类

话接上篇.成功配置好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

【COCOS2DX-LUA 脚本开发之十二】Hybrid模式-利用AssetsManager实现在线更新脚本文件lua、js、图片等资源(免去平台审核周期)

转载自:http://www.himigame.com/iphone-cocos2dx/1354.html 首先说明一个问题: 为什么要在线更新资源和脚本文件!? 对于此问题,那要说的太多了,简单概括,如果你的项目已经在google play 或Apple Store 等平台上架了,那么当你项目需要做一些活动或者修改前端的一些代码等那么你需要重新提交一个新版本给平台,这时候你的上架时候是个不确定的时候,具体什么时候能上架,主要跟平台有关,你再着急,也没有用的. 那么如果你的项目是使用脚本语言进行

Win32下 Qt与Lua交互使用(三):在Lua脚本中connect Qt 对象

话接上文.笔者为了方便使用Lua,自己编写了一个Lua的类.主要代码如下: QLua.h 1 #ifndef QLUA_H 2 #define QLUA_H 3 4 // own 5 #include "include/lua.hpp" 6 7 // qt 8 #include <QObject> 9 #include <QFile> 10 #include <QDebug> 11 12 #include <QWidget> 13 #in

Win32下 Qt与Lua交互使用(四):在Lua脚本中自由执行Qt类中的函数

话接上篇.通过前几篇博客,我们实现在Lua脚本中执行Qt类中函数的方法,以及在Lua脚本中连接Qt对象的信号与槽. 但是,我们也能发现,如果希望在Lua脚本中执行Qt类的函数,就必须绑定一个真正实现功能的函数.如QWidget::show(),需要写一个在栈中取出widget指针,widget调用show()函数的方式.如果希望在Lua中调用大量函数,就需要编写大量的C++实现函数.有没有什么省时省力的好方法呢? 上一篇中我们实现了在Lua脚本中连接信号与槽.我们只是传过去了两个QObject的

Lua脚本在C++下的舞步(入门指引)(转)

http://www.cnblogs.com/hmxp8/archive/2011/11/23/2259777.html 转帖来自:http://www.acejoy.com/bbs/viewthread.php?tid=1931&extra=page%3D1 现在,越来越多的C++服务器和客户端融入了脚本的支持,尤其在网游领域,脚本语言已经渗透到了方方面面,比如你可以在你的客户端增加一个脚本,这个脚本将会帮你在界面上显示新的数据,亦或帮你完成某些任务,亦或帮你查看别的玩家或者NPC的状态...

lua与C++的交互

参考文档地址: Lua 与C交互 项目名字:SimFrame 项目语言:C++,lua(5.1) 项目框架:Cocos2d-x 2.2.3 一.创建项目 首先 cd到cocos2d-x包下的tools中的project-creator目录,输入 ./create_project.py -project SimFrame -package com.zyl.test -language lua 在projects目录下会有一个SimFrame的项目,打开SimFrame.xcodeproj(我用的是