C++转让Lua
转载请注明出处:http://blog.csdn.net/zhy_cheng/article/details/39756423
我使用的cocos2d-x版本号是2.3.3。先在一个C++project中配置好lua的环境。
首先导入lua项目
1.libluaproject是cocos2d-x-2.2.3\scripting\lua\proj.win32\liblua.vcxproj这个文件。导入VS2010project中
2.包括文件夹:在project的属性-配置属性-C/C++-常规-附加包括文件夹中增加$(ProjectDir)..\..\..\scripting\lua\tolua,$(ProjectDir)..\..\..\scripting\lua\lua。
$(ProjectDir)..\..\..\scripting\lua\lua
3.在属性-配置属性-链接器-输入-附加依赖项增加liblua.lib和lua51.lib
好了,lua环境就配置好了
在HelloWorld.cpp中增加头文件引用#include "CCLuaEngine.h",#include "script_support\CCScriptSupport.h"
以下開始写lua了,lua代码例如以下
pageName="equip"
a={student="zhangsan",age=23}
function main()
print("leoooooooooooooo")
end function printSomething(name,age)
print("-----------------name is "..name)
print("-----------------age is "..age)
end function returnSomething(name,age)
return name,age
end
这个写的lua代码,以下看C++部分,首先在AppDelegate.cpp中增加
CCLuaEngine* pEngine = CCLuaEngine::defaultEngine(); CCScriptEngineManager::sharedManager()->setScriptEngine(pEngine);
来设置lua的引擎
然后在HelloWorld.cpp的点击事件中将lua代码载入
CCLuaEngine *pEngine = CCLuaEngine::defaultEngine();
pEngine->executeString("require \"lua/hello.lua\"");
以下主要说3个知识点
1.调用lua的函数
//调用无參数无返回值的函数
lua_State* L=pEngine->getLuaStack()->getLuaState();
//获得栈顶,而且保存值
int top=lua_gettop(L);
lua_getglobal(L,"main");
//看看在不在那里
if(!lua_isfunction(L,-1))
{
CCLog("------------return");
}
//第一个參数是栈的状态的指针,第二个參数是參数个数,第三个參数是返回值的个数,第四个參数是出现错误的回调函数的地址
lua_pcall(L,0,0,0);
//还原栈
lua_settop(L,top); //调用有參数,无返回值的函数
top=lua_gettop(L);
lua_getglobal(L,"printSomething");
//看看在不在那里
if(!lua_isfunction(L,-1))
{
CCLog("------------return");
}
//一一相应啊
lua_pushstring(L,"zhycheng");
lua_pushnumber(L,24);
lua_pcall(L,2,0,0);
lua_settop(L,top); //调用有參数。有两个返回值的函数
top=lua_gettop(L);
lua_getglobal(L,"returnSomething");
if(!lua_isfunction(L,-1))
{
CCLog("------------return");
}
lua_pushstring(L,"new");
lua_pushnumber(L,22);
lua_pcall(L,2,2,0);
if(!lua_isnumber(L,-1)||!lua_isstring(L,-2))
{
CCLog("return error");
}
//name在以下
int age =(int)lua_tonumber(L,-1);
const char* name=lua_tostring(L,-2);
CCLog("age is %d",age);
CCLog("name %s",name);
lua_settop(L,top);
2.获得lua的一个全局变量的值
//读取lua的全局变量
top=lua_gettop(L);
lua_getglobal(L,"pageName");
if(!lua_isstring(L,-1))
{
CCLog("return error");
}
const char* equipname=lua_tostring(L,-1);
CCLog("name is %s",equipname);
lua_settop(L,top);
3.訪问全局table的某一个值
//获取lua表中的某个key的value
top=lua_gettop(L);
lua_getglobal(L,"a");
if(!lua_istable(L,-1))
{
CCLog("error----------------");
}
lua_pushstring(L,"student");
//lua_gettable是一个函数。它首先让键值出站,获取对应表元素的值。然后把这个值入栈
//此时student在-2的位子。然这个key出栈。让他的值入栈
lua_gettable(L,-2);
if(!lua_isstring(L,-1))
{
CCLog("error --------------");
}
const char* studentName = lua_tostring(L, -1);
CCLog("studentName is %s",studentName);
lua_settop(L,top);
//再获取的时候一定要注意栈的问题
//获取年龄
top=lua_gettop(L);
lua_getglobal(L,"a");
if(!lua_istable(L,-1))
{
CCLog("error----------------");
}
lua_pushstring(L,"age");
lua_gettable(L,-2);
if(!lua_isnumber(L,-1))
{
CCLog("error-----------------");
}
int aage=lua_tonumber(L,-1);
CCLog("aage is %d",aage);
lua_settop(L,top);
好了,就说这么多,对于栈的操作,能够从-1開始,也能够从1開始。从-1開始的话。就是从栈顶往下,从1開始就是从栈底向上。
下载资源:http://download.csdn.net/detail/zhy_cheng/7999945
版权声明:本文博客原创文章,博客,未经同意,不得转载。
C++转让Lua的更多相关文章
- 转让lua性能executeGlobalFunction
没有其他的,搞搞cocos2dx的lua文字,话lua这件事情在几年前学过一段时间.还曾对自己c++介面,我已经做了一些小东西.只是时间的流逝,模糊记忆. 拿起点功夫和成本.下面是我的一些经验. co ...
- lua三底漆:lua转让c/c++库(动态链接模式)
dll按功能luaL_openlib出口,然后lua使用package.loadlib导入库函数,基本就是这么个过程,以下上代码来说明一切. #include "stdafx.h" ...
- lua转让C++书面DLL达到“热更新”
原创作品,请注明出处转载CSDN:http://blog.csdn.net/relar/article/details/38084689 开发游戏server往往有"热更新"的需求 ...
- Lua转让C功能
在上一篇文章中(C调用lua函数)中.讲述了怎样用c语言调用lua函数,通常,A语言能调用B语言,反过来也是成立的.正如Java 与c语言之间使用JNI来互调.Lua与C也能够互调. 当lua调用c函 ...
- Lua 学习笔记(九)协同程序(线程thread)
协同程序与线程thread差不多,也就是一条执行序列,拥有自己独立的栈.局部变量和命令指针,同时又与其他协同程序共享全局变量和其他大部分东西.从概念上讲线程与协同程序的主要区别在于,一个具有多个线程的 ...
- 《Lua程序设计》9.1 协同程序基础 学习笔记
协同程序(coroutine)与线程(thread)差不多,也就是一条执行序列,拥有自己独立的栈.局部变量和指令指针,同时又与其他协同程序共享全局变量和其他大部分东西.从概念上讲线程与协同程序的主要区 ...
- lua执行字节码的过程介绍
前面一篇文章中介绍了lua给下面代码生成最终的字节码的整个过程,这次我们来看看lua vm执行这些字节码的过程. foo = "bar" local a, b = "a& ...
- lua 学习笔记(1)
一.lua函数赋值与函数调用 在lua中函数名也是作为一种变量出现的,即函数和所有其他值一样都是匿名的,当要使用某个函数时,需要将该函数赋值给一个变量,这样在函数块的其他地方就可以通过 ...
- 在redis中使用lua脚本让你的灵活性提高5个逼格
在redis的官网上洋洋洒洒的大概提供了200多个命令,貌似看起来很多,但是这些都是别人预先给你定义好的,但你却不能按照自己的意图进行定制, 所以是不是感觉自己还是有一种被束缚的感觉,有这个感觉就对了 ...
随机推荐
- (原创)(C#随笔)IEnumerable< ICollection < IList区别
public interface IEnumerable { IEnumerator GetEnumerator(); } 再看ICollection<T> public interfac ...
- go 冒泡排序
package main import ( "fmt" ) func main() { a := [...], , , , , , , , , } num := len(a) fm ...
- crontab linux
第1列分钟1-59第2列小时1-23(0表示子夜)第3列日1-31第4列月1-12第5列星期0-6(0表示星期天)第6列要运行的命令 下面是crontab的格式:分 时 日 月 星期 要运行的命令 这 ...
- 14.4.5 Configuring InnoDB Change Buffering 配置InnoDB Change Buffering
14.4.5 Configuring InnoDB Change Buffering 配置InnoDB Change Buffering 当INSERT,UPDATE,和删除操作在表上操作, 索引列的 ...
- NEU 1173: 这是物理学的奇迹!! 分解质数
1173: 这是物理学的奇迹!! 题目描述 goagain在做物理电学实验时需要一个2Ω的电阻,但是他发现他的实验台上只剩下了3Ω,4Ω,5Ω,6Ω的电阻若干,于是goagain把两个4Ω的电阻并联起 ...
- django中mysql数据库设置错误解决方法
刚在django中settings.py进行设置mysql数据库. 当进行执行python manage.py shell命令时会报以下错误: 只需要在settings.py中 DATABASES = ...
- C++获取文件大小常用技巧
C++编程语言在程序开发应用中能够帮助我们轻松的完成许多功能需求.比如今天为大家介绍的C++获取文件大小的方法,就可以以多种方式轻松的实现.现在将会实现方法呈现给大家,以便大家参考. C++获取文件大 ...
- Windows8和MacOS10.9双系统安装及Mac经常使用软件安装--联想E49A
前提 本篇内容所描写叙述的内容仅仅适合联想E49A笔记本,经过本篇的内容之后,对于Mac OS 10.9的使用达到正常工作使用的标准,完美度已经比較好了. 结果例如以下:显卡.网卡(RTL8168). ...
- AMFPHP1.4与PHP5.3及以上版本号不兼容问题的解决
近期在升级PHP5.4版本号,AMFPHP出现了兼容性问题.解决过程记录例如以下. 1.ereg类相关函数改动为preg相关函数. 2.通过错误日志输出的提示.将全部以静态方式调用的类函数加入stat ...
- LeetCode总结 -- 树的性质篇
树的性质推断是树的数据结构比較主要的操作,一般考到都属于非常easy的题目,也就是第一道入门题.面试中最好不能有问题,力求一遍写对.不要给面试官不论什么挑刺机会.LeetCode中关于树的性质有下面题 ...