我们主要解决如下几个问题:

转:http://www.cnblogs.com/zisou/p/cocos2dx-lua2.html

1,C++如何获取Lua里面的一个变量值?

2,C++如何获取Lua里面一个Table(Lua利用Table实现面向对象,那就能调用Lua里面的比较高级的引用方法)

3,C++如何访问Lua里面的一个方法?

4,C++如何访问Lua里面的一个带参数的方法?

5,C++如何访问Lua里面的一个带参数的方法并且带返回值?

如果以上问题都解决了,基本能满足我们游戏开发中遇到的数据通信的问题;

我整合了HIMI哥哥这篇教程里面的思路,重构了一下,定义出了更好用的C++/lua数据通讯类库;

http://blog.csdn.net/xiaominghimi/article/details/8816887

下面我直接贴函数了,大家自取:

PublicSendLuaData.h

//  PublicSendLuaData.cpp
//// Lua and C++/C 交互类
#ifndef __PublicSendLuaData__
#define __PublicSendLuaData__ #include "cocos2d.h"using namespace cocos2d;
using namespace std; extern "C" {
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}; class PublicSendLuaData{
public: static PublicSendLuaData* getInstance(); /*
直接获取Lua中得变量名值
文件名 luaFileName
变量名 varName
*/const char* getLuaVarString(const char* luaFileName,const char* varName); /*
获取Lua中一个表中得节点名,甚至方法
文件名luaFileName
方法名varName
节点名
*/const char* getLuaVarOneOfTable(const char* luaFileName,const char* varName,const char* keyName); /*
调用Lua全局Table
lua文件名luaFileName
table变量名varName
*/const char* getLuaVarTable(const char* luaFileName,const char* varName); /*
带参数有返回
文件名luaFileName
方法名functionName
参数序列arraypar
参数类型arraypartype
*/const char* callLuaFuncParReturn(const char* luaFileName,const char* functionName,CCArray* arraypar,CCArray* arraypartype); /*
带参数无返回
文件名luaFileName
方法名functionName
参数序列arraypar
参数类型arraypartype
*/const void callLuaFuncPar(const char* luaFileName,const char* functionName,CCArray* arraypar,CCArray* arraypartype); private: static bool _isFirst;
static PublicSendLuaData* m_instance;
const char* getFileFullPath(const char* fileName);
~PublicSendLuaData();
}; #endif

PublicSendLuaData.cpp

//  PublicSendLuaData.cpp
//// Created by ZISOU-YSJ
//// Lua and C++/c 交互类
#include "PublicSendLuaData.h"
#include "CCLuaEngine.h" PublicSendLuaData* PublicSendLuaData::m_instance = NULL;
PublicSendLuaData* PublicSendLuaData::getInstance(){
if(!m_instance)
{ m_instance = new PublicSendLuaData();
}
return m_instance;
}
//获取变量名值const char* PublicSendLuaData::getLuaVarString(const char* luaFileName,const char* varName){ lua_State* ls = CCLuaEngine::defaultEngine()->getLuaStack()->getLuaState(); int isOpen = luaL_dofile(ls, getFileFullPath(luaFileName));
if(isOpen!=0){
CCLOG("Open Lua Error: %i", isOpen);
return NULL;
} lua_settop(ls, 0);
lua_getglobal(ls, varName); int statesCode = lua_isstring(ls, 1);
if(statesCode!=1){
CCLOG("Open Lua Error: %i", statesCode);
return NULL;
} const char* str = lua_tostring(ls, 1);
lua_pop(ls, 1); return str;
} const char* PublicSendLuaData::getLuaVarOneOfTable(const char* luaFileName,const char* varName,const char* keyName){ lua_State* ls = CCLuaEngine::defaultEngine()->getLuaStack()->getLuaState(); int isOpen = luaL_dofile(ls, getFileFullPath(luaFileName));
if(isOpen!=0){
CCLOG("Open Lua Error: %i", isOpen);
return NULL;
} lua_getglobal(ls, varName); int statesCode = lua_istable(ls, -1);
if(statesCode!=1){
CCLOG("Open Lua Error: %i", statesCode);
return NULL;
} lua_pushstring(ls, keyName);
lua_gettable(ls, -2);
const char* valueString = lua_tostring(ls, -1); lua_pop(ls, -1); return valueString;
}
//执行Lua表,返回表结构const char* PublicSendLuaData::getLuaVarTable(const char* luaFileName,const char* varName){
lua_State* ls = CCLuaEngine::defaultEngine()->getLuaStack()->getLuaState(); int isOpen = luaL_dofile(ls, getFileFullPath(luaFileName));
if(isOpen!=0){
CCLOG("Open Lua Error: %i", isOpen);
return NULL;
} lua_getglobal(ls, varName); int it = lua_gettop(ls);
lua_pushnil(ls); string result=""; while(lua_next(ls, it))
{
string key = lua_tostring(ls, -2);
string value = lua_tostring(ls, -1); result=result+key+":"+value+"\t"; lua_pop(ls, 1);
}
lua_pop(ls, 1); return result.c_str();
} //带参执行Lua方法有返回值const char* PublicSendLuaData::callLuaFuncParReturn(const char* luaFileName,const char* functionName,CCArray* arraypar,CCArray* arraypartype){
lua_State* ls = CCLuaEngine::defaultEngine()->getLuaStack()->getLuaState(); int isOpen = luaL_dofile(ls, getFileFullPath(luaFileName));
if(isOpen!=0){
CCLOG("Open Lua Error: %i", isOpen);
return NULL;
} lua_getglobal(ls, functionName);
int countnum = arraypar->count();
if(countnum>0)
{
for (int i = 0; i<arraypar->count(); i++) {
CCString* typestr = (CCString*)arraypartype->objectAtIndex(i);
CCString* strnr = (CCString*)arraypar->objectAtIndex(i);
if(typestr->isEqual(CCString::create("string")))
{
lua_pushstring(ls, strnr->getCString());
}
else if(typestr->isEqual(CCString::create("int")))
{
lua_pushnumber(ls, strnr->intValue());
}
else if(typestr->isEqual(CCString::create("bool")))
{
lua_pushboolean(ls, strnr->boolValue());
}
}
}
/*
lua_call
第一个参数:函数的参数个数
第二个参数:函数返回值个数
*/
lua_call(ls, countnum, 1); const char* iResult = lua_tostring(ls, -1); return iResult;
} //带参执行Lua方法无返回值const void PublicSendLuaData::callLuaFuncPar(const char* luaFileName,const char* functionName,CCArray* arraypar,CCArray* arraypartype){
lua_State* ls = CCLuaEngine::defaultEngine()->getLuaStack()->getLuaState(); int isOpen = luaL_dofile(ls, getFileFullPath(luaFileName));
if(isOpen!=0){
CCLOG("Open Lua Error: %i", isOpen);
} lua_getglobal(ls, functionName);
int countnum = arraypar->count();
if(countnum>0)
{
for (int i = 0; i<arraypar->count(); i++) {
CCString* typestr = (CCString*)arraypartype->objectAtIndex(i);
CCString* strnr = (CCString*)arraypar->objectAtIndex(i);
if(typestr->isEqual(CCString::create("string")))
{
lua_pushstring(ls, strnr->getCString());
}
else if(typestr->isEqual(CCString::create("int")))
{
lua_pushnumber(ls, strnr->intValue());
}
else if(typestr->isEqual(CCString::create("bool")))
{
lua_pushboolean(ls, strnr->boolValue());
}
}
}
/*
lua_call
第一个参数:函数的参数个数
第二个参数:函数返回值个数
*/
lua_call(ls, countnum, 0); } const char* PublicSendLuaData::getFileFullPath(const char* fileName){
return CCFileUtils::sharedFileUtils()->fullPathForFilename(fileName).c_str();
} PublicSendLuaData::~PublicSendLuaData(){ CC_SAFE_DELETE(m_instance);
m_instance=NULL;
}

上面都有注释,我就不详细去一一赘述,不过以上方法能满足大部分在C++中访问Lua的各种需求;

我这里就只说一个例子如:

CCArray* arraypar = CCArray::create();
arraypar->addObject(CCString::create("参数值"));
CCArray* arraytype =CCArray::create();
arraytype->addObject(CCString::create("string"));
PublicSendLuaData::getInstance()->callLuaFuncPar("Lua文件名", "参数名", arraypar, arraytype);

这个就是具体调用Lua里面一个带参数全局方法的语句;

我写了一个类型匹配的方法:

       if(typestr->isEqual(CCString::create("string")))
{
lua_pushstring(ls, strnr->getCString());
}
else if(typestr->isEqual(CCString::create("int")))
{
lua_pushnumber(ls, strnr->intValue());
}
else if(typestr->isEqual(CCString::create("bool")))
{
lua_pushboolean(ls, strnr->boolValue());
}

大家使用的时候注意匹配一下这个就行;

那又人问了,如果在Lua中访问C++函数怎么办呢?还记得我文章第一篇中得Lua调用C++函数类的方法呢?

我提倡使用tolua++工具类去坐Lua访问C++;

路径问题

res里如果是蓝色引用文件夹需要填完全路径
如果是黄色直接填Lua文件名
如果是自更新的:
local loaclurl = CCFileUtils:sharedFileUtils():getWritablePath()
loaclurl+"/XX/XX/XX/XXX.lua"

c++调用lua的更多相关文章

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

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

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

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

  3. C中调用Lua函数

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

  4. cocos2dx之C++调用Lua

    原文地址:http://blog.csdn.net/dingkun520wy/article/details/49839701 1.引入头文件 #include "cocos2d.h&quo ...

  5. C语言中调用Lua

    C语言和Lua天生有两大隔阂: 一.C语言是静态数据类型,Lua是动态数据类型 二.C语言需要程序员管理内存,Lua自动管理内存 为了跨越世俗走到一起,肯定需要解决方案. 解决第一点看上去比较容易,C ...

  6. VC和VS调用Lua设置以及Lua C API使用。

    通过c++调用lua 脚本,    环境VC++6.0    lua  sdk 5.1.4 在调用前先认识几个函数.1.调用lua_open()将创建一个指向Lua解释器的指针.2. luaL_ope ...

  7. Java调用Lua脚本(LuaJava使用、安装及Linux安装编译)

    依赖包(附件有下载): 包名 类型 操作系统 luajava-1.1.jar jar ALL libluajava-1.1.so .so linux luajava-1.1.dll .dll wind ...

  8. Java调用Lua(转)

    Java 调用 Lua app发版成本高,覆盖速度慢,覆盖率页低.一些策略上的东西如果能够从服务端控制会方便一些.所以考虑使用Lua这种嵌入式语言作为策略实现,Java则是宿主语言. 总体上看是一个模 ...

  9. 简述C/C++调用lua中实现的自定义函数

    1.首先说下目的,为什么要这么做 ? 正式项目中,希望主程序尽量不做修改,于是使用C/C++完成功能的主干(即不需要经常变动的部分)用lua这类轻量级的解释性语言实现一些存在不确定性的功能逻辑:所以, ...

随机推荐

  1. Delphi_07_Delphi_Object_Pascal_基本语法_05_函数参数

    这里主要讨论Delphi中函数.方法的相关内容. 一.工程文件 { Delphi语法方法和函数 1.方法 2.函数 } program Routine; {$APPTYPE CONSOLE} uses ...

  2. java 开发模式

    Java-开发模式 Java Web开发方案有多种,这里列举一些经典的开发模式进行横向比较JSP+JAVABEAN开发模式:    特点:该模式将业务逻辑与页面表现进行分离,在一定程度上增加了程序的可 ...

  3. java面试题——HashMap和Hashtable 的区别

    一.HashMap 和Hashtable 的区别 我们先看2个类的定义 public class Hashtable extends Dictionary implements Map, Clonea ...

  4. Stream

    Stream的好处 1.Stream AP的引入弥补了JAVA函数式编程的缺陷.2.Stream相比集合类占用内存更小:集合类里的元素是存储在内存里的,Stream里的元素是在访问的时候才被计算出来. ...

  5. JavaScript--面向对象--猜拳游戏

    //html代码 <!doctype html> <html> <head> <meta charset="UTF-8"> < ...

  6. jqGrid插件getCol方法的一个改进

    jgGrid插件是非常常用的一个基于jQuery的表格插件,功能非常强大.我最近也频繁使用.但是这个插件也有一些不够完善的地方.比如这个getCol方法. getCol方法接受三个参数 colname ...

  7. 关于从Activity A跳转到Activity B ,其中Activity A中有一个VideoView,Activity B中有一个MediaPlayer。

    两个不同的视频的跳转, 前面我是在onStop()方法中销毁VideoView(因为MediaPlayer是全局共用的,而VideoView内包含MediaPlayer),但是每次进入Activity ...

  8. ios UIWebView自定义Alert风格的弹框

    之前开发过一个App,因为公司之前写好了网页版的内容和安卓版本的App,我进去后老板要求我ios直接用网页的内容,而不需要自己再搭建框架.我一听,偷笑了,这不就是一个UIWebView吗?简单! 但是 ...

  9. Activity的释放

    1.ActivityTwo.finish(); 在你的activity动作完成的时候,或者Activity需要关闭的时候,调用此方法.当你调用此方法的时候,系统只是将最上面的Activity移出了栈, ...

  10. nodejs安装和环境部署

    windows 下: 1. 下载windows平台nodejs环境安装包,百度一下nodejs官网,找到DOWNLOADS点击,找到Windows Installer 如果为64位电脑可以选择64位版 ...