【cocos2d-x + Lua(2) C++和lua数据通讯之间的互调】

【cocos2d-x + Lua(2) C++和lua数据通讯之间的互调】,第1张

概述我们主要解决如下几个问题: 转自: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+

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

转自: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数据通讯之间的互调】所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1010668.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存