我们主要解决如下几个问题:
转自: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;namespace std;extern C" {#include lua.h"#include lualib.hlauxlib.h"};class PublicSendLuaData{public: static PublicSendLuaData* getInstance(); /* 直接获取Lua中得变量名值 文件名 luafilename 变量名 varname */ const char* getLuaVarString(char* luafilename,char* varname); 获取Lua中一个表中得节点名,甚至方法 文件名luafilename 方法名varname 节点名 char* getLuaVarOneOftable(char* varname,255); line-height:1.5!important">char* keyname); 调用Lua全局table lua文件名luafilename table变量名varname char* getLuaVartable( 带参数有返回 文件名luafilename 方法名functionname 参数序列arraypar 参数类型arraypartype char* callLuaFuncParReturn(char* functionname,CCArray* arraypar,CCArray* arraypartype); 带参数无返回 文件名luafilename 方法名functionname 参数序列arraypar 参数类型arraypartype voID callLuaFuncPar( arraypartype); private: static bool _isFirst; static PublicSendLuaData* m_instance; char* getfileFullPath(char* filename); ~PublicSendLuaData();};#endif
PublicSendLuaData.cpp
Created by ZISOU-YSJ Lua and C++/c 交互类#include PublicSendLuaData.hccluaEngine.h"PublicSendLuaData* PublicSendLuaData::m_instance = NulL;PublicSendLuaData* PublicSendLuaData::getInstance(){ if(!m_instance) { m_instance = new PublicSendLuaData(); } return m_instance;}获取变量名值char* PublicSendLuaData::getLuaVarString(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(return NulL; } char* str = lua_tostring(ls,128); line-height:1.5!important">1); lua_pop(ls,128); line-height:1.5!important">1); return str;}char* PublicSendLuaData::getLuaVarOneOftable(char* keyname){ lua_State* ls = ccluaEngine::defaultEngine()->getLuaStack()->getLuaState(); return NulL; } lua_getglobal(ls,255); line-height:1.5!important">int statesCode = lua_istable(ls,-return NulL; } lua_pushstring(ls,keyname); lua_gettable(ls,-2); char* valueString = lua_tostring(ls,128); line-height:1.5!important">1); lua_pop(ls,255); line-height:1.5!important">return valueString;}执行Lua表,返回表结构char* PublicSendLuaData::getLuaVartable(char* varname){ lua_State* ls = ccluaEngine::defaultEngine()->getLuaStack()->getLuaState(); int it = lua_gettop(ls); lua_pushnil(ls); string result=""; while(lua_next(ls,it)) { string key = lua_tostring(ls,128); line-height:1.5!important">2); string value = lua_tostring(ls,128); line-height:1.5!important">1); result=result+key+:"+value+\t"; lua_pop(ls,128); line-height:1.5!important">1); } lua_pop(ls,255); line-height:1.5!important">return result.c_str();}带参执行Lua方法有返回值char* PublicSendLuaData::callLuaFuncParReturn( arraypartype){ lua_State* ls = ccluaEngine::defaultEngine()->getLuaStack()->getLuaState(); 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 int"))) { lua_pushnumber(ls,strnr->intValue()); } bool"))) { lua_pushboolean(ls,strnr->boolValue()); } } } lua_call 第一个参数:函数的参数个数 第二个参数:函数返回值个数 */ lua_call(ls,countnum,255); line-height:1.5!important">char* iResult = lua_tostring(ls,255); line-height:1.5!important">return iResult;}带参执行Lua方法无返回值voID PublicSendLuaData::callLuaFuncPar(0); }char* PublicSendLuaData::getfileFullPath(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("));PublicSendLuaData::getInstance()->callLuaFuncPar(Lua文件名",0); line-height:1.5!important">参数名 这个就是具体调用Lua里面一个带参数全局方法的语句;我写了一个类型匹配的方法:
if(typestr->isEqual(CCString::create(boolValue()); }
大家使用的时候注意匹配一下这个就行;
那又人问了,如果在Lua中访问C++函数怎么办呢?还记得我文章第一篇中得Lua调用C++函数类的方法呢?
我提倡使用tolua++工具类去坐Lua访问C++;
总结以上是内存溢出为你收集整理的【cocos2d-x + Lua(2) C++和lua数据通讯之间的互调】全部内容,希望文章能够帮你解决【cocos2d-x + Lua(2) C++和lua数据通讯之间的互调】所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)