【cocos2d-x + Lua(2) C++和lua数据通讯之间的互调】
我们主要解决如下几个问题:
转载注明出处: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!=){
CCLOG("Open Lua Error: %i", isOpen);
return NULL;
} lua_settop(ls, );
lua_getglobal(ls, varName); int statesCode = lua_isstring(ls, );
if(statesCode!=){
CCLOG("Open Lua Error: %i", statesCode);
return NULL;
} const char* str = lua_tostring(ls, );
lua_pop(ls, ); 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!=){
CCLOG("Open Lua Error: %i", isOpen);
return NULL;
} lua_getglobal(ls, varName); int statesCode = lua_istable(ls, -);
if(statesCode!=){
CCLOG("Open Lua Error: %i", statesCode);
return NULL;
} lua_pushstring(ls, keyName);
lua_gettable(ls, -);
const char* valueString = lua_tostring(ls, -); lua_pop(ls, -); 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!=){
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, -);
string value = lua_tostring(ls, -); result=result+key+":"+value+"\t"; lua_pop(ls, );
}
lua_pop(ls, ); 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!=){
CCLOG("Open Lua Error: %i", isOpen);
return NULL;
} lua_getglobal(ls, functionName);
int countnum = arraypar->count();
if(countnum>)
{
for (int i = ; 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, ); const char* iResult = lua_tostring(ls, -); 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!=){
CCLOG("Open Lua Error: %i", isOpen);
} lua_getglobal(ls, functionName);
int countnum = arraypar->count();
if(countnum>)
{
for (int i = ; 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, ); } 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++;
———————————————————————————————————————————————————
ps:仙凡奇缘官网 http://www.xianfancoco.com (新版1.1已经上线)
cocos2dxQQ交流群:41131516
【cocos2d-x + Lua(2) C++和lua数据通讯之间的互调】的更多相关文章
- openwrt 里LUA程序怎么获取POST数据?
https://www.zhihu.com/question/31579325 作者:齐葛链接:https://www.zhihu.com/question/31579325/answer/28342 ...
- cocos2dx lua binding ,cocos2dx 绑定lua测试
前面2篇分别简单介绍 手动bind C++ 类和lua:http://blog.csdn.net/chenee543216/article/details/12074771 使用tolua++简化工作 ...
- (转) Lua使用心得一 LUA和VC整合
这几天研究了一下lua,主要关注的是lua和vc之间的整合,把代码都写好放在VC宿主程序里,然后在lua里调用宿主程序的这些代码(或者叫接口.组件,随便你怎么叫),希望能用脚本来控制主程序的行为.这实 ...
- Embedding Lua in C: Using Lua from inside C.
Requirments: 1: The Lua Sources. 2: A C compiler - cc/gcc/g++ for Unix, and Visual C++ for Wi ...
- 整理Lua和Unity和Lua交互文章链接
重点文章: 1.[Unity3D]Unity3D游戏开发之Lua与游戏的不解之缘(上) 2.[Unity3D]Unity3D游戏开发之Lua与游戏的不解之缘(中) 3.Lua和C++交互详细总结 4. ...
- lua脚本之lua语言简介以及lua的安装
本博主不擅于进行文字创作,所以,相当一部分文字皆复制于其他博文.还希望能够得到谅解. 一.Lua语言简介 Lua是一个免费的开源软件,可以免费用于科研及商业.Lua具有一个专家团队在维护和升级,其设 ...
- Android错误:can not get file data of lua/start_v2.op [LUA ERROR] [string "require "lua/start_v2””] 已解决
错误: can not get file data of lua/start_v2.op [LUA ERROR] [string "require "lua/start_v2””] ...
- 【Lua】linux下lua+mod_lwt环境搭建
Lua 是一个小巧的脚本语言.它具有轻量级.可扩展等优势.它可以作为一个强大.轻量的脚本语言,供任何需要的程序使用. LWT (Lua Web Tools) 可让你使用 Lua 开发 Web 应用,并 ...
- [Lua快速了解一下]Lua运行
-Lua的Hello World print("Hello World") 分号可选 -类似python,进入Lua后再shell中打命令执行语句也可 > print(&qu ...
随机推荐
- IOS开发基础知识--碎片30
1:ios 相册操作 ALAssetsLibrary 知识点 a ALAssetsLibrary 实例为我们提供了获取相册(照片app)中的图片和视频的功能.在ios8 photos framewor ...
- Linux命令学习总结:cp命令
命令简介: cp命令用来复制文件或目录.指令英文原义:copy 指令所在路径:/bin/cp 命令语法: Usage: cp [OPTION]... [-T] SOURCE DEST or: cp [ ...
- MYSQL多实例配置方法 mysqld_multi方法
在实际的开发过程中,可能会需要在一台服务器上部署多个MYSQL实例,那建议使用MYSQL官方的解决方案 mysqld_multi 1.修改my.cnf 如一个定义两个实例的参考配置: [mysqld_ ...
- C++ 栈和堆的区别
C++中的存储区分为全局数据区.代码区.堆.栈. 全局数据区存放静态数据.全局变量.常量. 代码区存放所有类成员函数和非成员函数的代码. 栈区存放用于函数的返回地址.形参.局部变量.返回类型. 堆区存 ...
- markdown简要说明显示样式
markdown 什么是markdown: Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式. Markdown具有一系列 ...
- ununtu设置开机启动服务-手工将Tomcat设为自启动服务
配置Ubuntu Server,上面装了一Tomcat7,希望在服务器电源打开后,希望没有登录的情况下也可以自动启动Tomcat 1.编写启动文件/etc/init.d/tomcat7 tomcat7 ...
- android 项目中出现红色感叹号的解决方法
问题原因]:工程中classpath中指向的包路径错误 [解决办法]:右键项目名称 BuildPath ---> Configure Build Paht...中,然后上面有几个选项卡找到 Li ...
- 4412开发板学习笔记-NFS服务器的搭建
转自iTOP-4412讨论群: http://www.topeetboard.com 先来介绍一下NFS: NFS 是Network File System的缩写,即网络文件系统.一种使用于分散式文件 ...
- Manacher's algorithm
Manacher's algorithm 以\(O(n)\)的线性时间求一个字符串的最大回文子串. 1. 预处理 一个最棘手的问题是需要考虑最长回文子串的长度为奇数和偶数的情况.我们通过在任意两个字符 ...
- 【2016-11-3】【坚持学习】【Day18】【Oracle 数据类型 与C#映射关系】
大部分类型的对应关系:原文:http://2143892.blog.51cto.com/2133892/499353 序号 Oracle数据类型 .NET类型 GetOracleValue类型 DbT ...