转载请注明出处: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的更多相关文章

  1. 转让lua性能executeGlobalFunction

    没有其他的,搞搞cocos2dx的lua文字,话lua这件事情在几年前学过一段时间.还曾对自己c++介面,我已经做了一些小东西.只是时间的流逝,模糊记忆. 拿起点功夫和成本.下面是我的一些经验. co ...

  2. lua三底漆:lua转让c/c++库(动态链接模式)

    dll按功能luaL_openlib出口,然后lua使用package.loadlib导入库函数,基本就是这么个过程,以下上代码来说明一切. #include "stdafx.h" ...

  3. lua转让C++书面DLL达到“热更新”

    原创作品,请注明出处转载CSDN:http://blog.csdn.net/relar/article/details/38084689 开发游戏server往往有"热更新"的需求 ...

  4. Lua转让C功能

    在上一篇文章中(C调用lua函数)中.讲述了怎样用c语言调用lua函数,通常,A语言能调用B语言,反过来也是成立的.正如Java 与c语言之间使用JNI来互调.Lua与C也能够互调. 当lua调用c函 ...

  5. Lua 学习笔记(九)协同程序(线程thread)

    协同程序与线程thread差不多,也就是一条执行序列,拥有自己独立的栈.局部变量和命令指针,同时又与其他协同程序共享全局变量和其他大部分东西.从概念上讲线程与协同程序的主要区别在于,一个具有多个线程的 ...

  6. 《Lua程序设计》9.1 协同程序基础 学习笔记

    协同程序(coroutine)与线程(thread)差不多,也就是一条执行序列,拥有自己独立的栈.局部变量和指令指针,同时又与其他协同程序共享全局变量和其他大部分东西.从概念上讲线程与协同程序的主要区 ...

  7. lua执行字节码的过程介绍

    前面一篇文章中介绍了lua给下面代码生成最终的字节码的整个过程,这次我们来看看lua vm执行这些字节码的过程. foo = "bar" local a, b = "a& ...

  8. lua 学习笔记(1)

    一.lua函数赋值与函数调用         在lua中函数名也是作为一种变量出现的,即函数和所有其他值一样都是匿名的,当要使用某个函数时,需要将该函数赋值给一个变量,这样在函数块的其他地方就可以通过 ...

  9. 在redis中使用lua脚本让你的灵活性提高5个逼格

    在redis的官网上洋洋洒洒的大概提供了200多个命令,貌似看起来很多,但是这些都是别人预先给你定义好的,但你却不能按照自己的意图进行定制, 所以是不是感觉自己还是有一种被束缚的感觉,有这个感觉就对了 ...

随机推荐

  1. Qml 写的弹出层控件(13篇博客)

    QML弹出窗口组件,灯箱效果.动画效果,可拖拽 核心思路:一个mask层,一个最顶层,都用rectangle,禁止事件穿透 使用 Popup { id: popup width: 200; heigh ...

  2. java中文排序问题(转)

    在Java中,对一个数组或列表(在本文中统称为集合)中的元素排序,是一个很经常的事情.好在Sun公司在Java库中实现了大部分功能.如果集合中的元素实现了Comparable接口,调用以下的静态(st ...

  3. 14.6.3 Grouping DML Operations with Transactions 组DML操作

    14.6.3 Grouping DML Operations with Transactions 组DML操作 默认情况下,连接到MySQL server 开始是以启动自动提交模式, 会自动提交每条S ...

  4. 设计模式(三)-- 适配器模式(Adapter)

    适配器模式(Adapter) 考虑一个记录日志的应用,由于用户对日志记录的要求很高,使得开发人员不能简单地采用一些已有的日志工具或日志框架来满足用户的要求,而需要按照用户的要求重新开发新的日志管理系统 ...

  5. Delphi动态申请数组内存的方法(不使用SetLength,采用和C相似的方式)

    procedure TForm1.Button1Click(Sender: TObject);type  TArr = array [0..0] of Integer;  PArr = ^TArr;v ...

  6. cocos2d 游戏开发:Cocos2d v3 "hello world"+显示飞船

    V3 RC4 版本号图片 显示一个飞船 将Chapter1中 SpaceCargoShip.png 文件 加入到项目里面. 代码在 init : CCSprite *spaceCargoShip = ...

  7. Delphi Windows API判断文件共享锁定状态(使用OpenFile来判断)

    一.概述 锁是操作系统为实现数据共享而提供的一种安全机制,它使得不同的应用程序,不同的计算机之间可以安全有效地共享和交换数据.要保证安全有效地操作共享数据,必须在相应的操作前判断锁的类型,然后才能确定 ...

  8. BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第3章节--SharePoint 2013 开发者工具 站点设置

    BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第3章节--SharePoint 2013 开发者工具 站点设置         你应该熟悉(假设还咩有)的SharePo ...

  9. FreeSwitch安装和配置记录

    安装FreeSwitch 主要示例,下面的命令: git clone -b v1.2.stable git://git.freeswitch.org/freeswitch.git cd freeswi ...

  10. Centos 5.5 更新网卡驱动 bnx2 version: 2.0.2

    操作系统:CentOS release 5.5 (Final) 故障现象:网卡无故自动down掉,使用service  network restart 重启后没多久又会自动down , 连接数大概在2 ...