原文地址:http://blog.csdn.net/dingkun520wy/article/details/49839701

1.引入头文件

#include "cocos2d.h"
#include "CCLuaEngine.h"
USING_NS_CC;
using namespace std;
extern "C"{
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}

2导入Lua文件

如果是cocos2dx的Lua工程只需要在main.lua里面引用就可以了


3.Lua文件编写

--Lua变量
strTemp = "乐逍遥"
--Lua的table
tableTemp = {name = "乐逍遥Jun", uuid = "001"}
--没有参数的函数
function test()
return 100
end
--有参数的函数
function testadd(a,b,str)
local c = a+b
return c, str
end

4.C++中的调用

首先是找到AppDelegate.cpp中的

#if (COCOS2D_DEBUG > 0) && (CC_CODE_IDE_DEBUG_SUPPORT >0)

将CC_CODE_IDE_DEBUG_SUPPORT的值改为0

如果是没有参数只有一个int返回值的Lua函数只需要调用cocos2dx封装好的executeGlobalFunction函数就行

auto engine = LuaEngine::getInstance();
engine->executeGlobalFunction("test");

如果是比较负责的函数

LuaStack * L =LuaEngine::getInstance()->getLuaStack();
lua_State* tolua_s = L->getLuaState(); //--------有参数和返回值的Lua函数的调用---------
lua_getglobal(tolua_s, "testadd"); // 获取函数,压入栈中
lua_pushnumber(tolua_s, 10); // 压入第一个参数
lua_pushnumber(tolua_s, 20); // 压入第二个参数
lua_pushstring(tolua_s, "测试"); // 压入第三个参数
int iRet= lua_pcall(tolua_s, 3, 2, 0);// 调用函数,调用完成以后,会将返回值压入栈中,2表示参数个数,1表示返回结果个数。
if (iRet) // 调用出错
{
const char *pErrorMsg = lua_tostring(tolua_s, -1);
CCLOG("错误-------%s",pErrorMsg);
return ;
}
int fValue = lua_tonumber(tolua_s, -2); //获取第一个返回值
string str = lua_tostring(tolua_s, -1); //获取第二个返回值
CCLOG("有参数和返回值的Lua函数的调用---%d---,%s",fValue,str.c_str()); //--------------读取Lua的变量------------
lua_getglobal(tolua_s, "strTemp");
string strTemp = lua_tostring(tolua_s, -1);
CCLOG("读取Lua的变量---%s",strTemp.c_str()); //-------------读取Lua的table-----------
lua_getglobal(tolua_s,"tableTemp");
lua_getfield(tolua_s,-1,"name");
string strName = lua_tostring(tolua_s,-1);
CCLOG("读取Lua的table--%s",strName.c_str());

5.注意事项

1.如果你是cpp调用lua函数,那么你的这个lua函数不能是local的

cocos2dx之C++调用Lua的更多相关文章

  1. cocos2d-x 3.0 在C++中调用lua函数

    代码用的是<cocos2d-x 3.0 在lua中调用自定义类>中的代码. 在上篇的基础上进行扩充. 写lua函数 local function process_packet(user_d ...

  2. cocos2d-x 3.0 在C++中调用lua函数(2)

    个人觉得3.0里面, 在C++下面调用lua函数很不方便, 所以就扩展了一个类, 继承自LuaStack, 代码和使用方式如下: #ifndef __CC_LUA_STACKEX_H_ #define ...

  3. vs如何在C++中调用Lua

    最近Cocos2dx的学习卡壳了,一般的照抄代码我不想写上来,但想示例也想得我头晕...为了放松大脑调整状态于是开始学习Lua.Lua的语法学习还是比较简单的,学过javascript或者vbscri ...

  4. 【COCOS2DX-LUA 脚本开发之一】在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)并介绍脚本在游戏中详细用途!

    [COCOS2DX-LUA 脚本开发之一]在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)并介绍脚本在游戏中详细用途! 分类: [Cocos2dx Lua 脚本开发 ] 2012-04-1 ...

  5. cocos2dx 3.x for lua "异步加载"实现过程

    在lua中,cocos2dx 建立的栈只能被一个线程(主线程)访问,如果在c++建立子线程,然后通过c++调用lua回调函数实现异步加载就会报错. 如果试图通过c++子线程直接实现加载资源,返回一个布 ...

  6. lua调用java java调用lua[转载]

    转载:http://dualface.github.io/blog/2013/01/01/call-java-from-lua/LuaJavaBridge - Lua 与 Java 互操作的简单解决方 ...

  7. c++调用lua

    我们主要解决如下几个问题: 转:http://www.cnblogs.com/zisou/p/cocos2dx-lua2.html http://www.cnblogs.com/sevenyuan/p ...

  8. vs2013如何在C++中调用Lua(二)

    Lua学习笔记 vs2013如何在C++中调用Lua (此为转载教程) 本人试过完全可行 一.准备工作 1.下载Lua源码,地址:http://www.lua.org/download.html(我用 ...

  9. C中调用Lua函数

    我们先来看一个简单的例子: lua_State* L = NULL; // 内部调用lua函数 double f(double x, double y) { double z; lua_getglob ...

随机推荐

  1. 关于网络连接方式的总结(HostOnly,NAT....)

    真实的网络结构: 最左侧的电脑左侧的线代表,如果这台电脑有网卡的话可以去连接别的电脑. 在一台Windows中用VMware来安装一个Linux系统(用虚线的都代表不是真实的) 上图中的虚拟网关在哪里 ...

  2. 关于在Eclipse中构建patch开发环境

    git仓库中不能添加空文件夹. 至于为什么git 仓库中不能添加空文件夹,我没有找到具体的原因. 在V2EX上有人说: 我猜是因为git的内部实现,即只对文件做快照决定的吧,另一方面空文件夹确实对源代 ...

  3. Java Classloader原理分析

       类的加载过程指通过一个类的全限定名来获取描述此类的二进制字节流,并将其转化为方法区的数据结构,进而生成一个java.lang.Class对象作为方法区这个类各种数据访问的入口.这个过程通过Jav ...

  4. Commons JXPath - Extension Functions

    Standard Extension Functions 创建新的对象 JXPathContext context = JXPathContext.newContext(null); Book boo ...

  5. Jersey(1.19.1) - Deploying a RESTful Web Service

    JAX-RS provides a deployment agnostic abstract class Application for declaring root resource and pro ...

  6. Ajax-Demo

    index.jsp 1 <%@ page language="java" contentType="text/html; charset=UTF-8" p ...

  7. 在Ubuntu下配置Apache多域名服务器

    1. 目标: 在本机 实现访问不同域名 可以访问不同的目录. 即:访问a.com 进入 /var/www/a 目录下的程序,访问b.com 进入/var/www/b目录下的程序. 2.遇到的问题: / ...

  8. 搭建私有git代码托管服务就是这么简单(简单5步)

    部署一个git代码托管服务就是这么简单 --基于阿里云ecs以docker容器运行gogs代码托管服务 部署步骤: 1.新建ecs云主机,选定操作系统为ubuntu 12.4tls 2.搭建docke ...

  9. 解决oracle归档日志写满了(ORA-00257)的问题

    解决ORA-00257: archiver error. Connect internal only, until freed 此问题属于归档日志满了. 解决办法: SQL> select * ...

  10. 关于fputs和fgets的几个细节

    C语言中两个标准IO fputs和fgets都是针对行来进行数据的读取的!这里关于这两个IO函数我有几个小细节想在这里和大家分享一下,希望能够对大家产生帮助! 首先贴上这两个函数的函数声明,下面以这两 ...