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

前端之家收集整理的这篇文章主要介绍了【cocos2d-x + Lua(2) C++和lua数据通讯之间的互调】前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

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

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

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

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

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

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

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

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

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

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

PublicSendLuaData.h

@H_404_4@
//@H_404_4@  PublicSendLuaData.cpp
@H_404_4@//@H_404_4@
  Lua and C++/C 交互类@H_404_4@

#ifndef __PublicSendLuaData__
@H_404_4@#define@H_404_4@ __PublicSendLuaData__

#include @H_404_4@"@H_404_4@cocos2d.h@H_404_4@"@H_404_4@
using@H_404_4@ namespace@H_404_4@ cocos2d;
@H_404_4@namespace@H_404_4@ std;

@H_404_4@extern@H_404_4@ C@H_404_4@"@H_404_4@ {
#include @H_404_4@lua.h@H_404_4@"@H_404_4@
#include @H_404_4@lualib.h@H_404_4@lauxlib.h@H_404_4@"@H_404_4@
};

@H_404_4@class@H_404_4@ PublicSendLuaData{
@H_404_4@public@H_404_4@:
    
    @H_404_4@static@H_404_4@ PublicSendLuaData* getInstance();
    
    @H_404_4@/*@H_404_4@
     直接获取Lua中得变量名值
     文件名 luaFileName
     变量名 varName
     @H_404_4@*/@H_404_4@
    const@H_404_4@ char@H_404_4@* getLuaVarString(char@H_404_4@* luaFileName,char@H_404_4@* varName);
    
    @H_404_4@
     获取Lua中一个表中得节点名,甚至方法
     文件名luaFileName
     方法名varName
     节点名
     @H_404_4@char@H_404_4@* getLuaVarOneOfTable(char@H_404_4@* varName,255);line-height:1.5 !important;">char@H_404_4@* keyName);
    
    @H_404_4@
     调用Lua全局Table
     lua文件名luaFileName
     table变量名varName
     @H_404_4@char@H_404_4@* getLuaVarTable(
     带参数有返回
     文件名luaFileName
     方法名functionName
     参数序列arraypar
     参数类型arraypartype
     @H_404_4@char@H_404_4@* callLuaFuncParReturn(char@H_404_4@* functionName,CCArray* arraypar,CCArray* arraypartype);
    
    @H_404_4@
     带参数无返回
     文件名luaFileName
     方法名functionName
     参数序列arraypar
     参数类型arraypartype
     @H_404_4@void@H_404_4@ callLuaFuncPar( arraypartype);
    
    
@H_404_4@private@H_404_4@:
    
    @H_404_4@static@H_404_4@ bool@H_404_4@ _isFirst;
    @H_404_4@static@H_404_4@ PublicSendLuaData* m_instance;
    @H_404_4@char@H_404_4@* getFileFullPath(char@H_404_4@* fileName);
    @H_404_4@~PublicSendLuaData();
};

@H_404_4@#endif@H_404_4@
@H_404_4@

PublicSendLuaData.cpp

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

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

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

CCArray* arraypar = CCArray::create();
arraypar@H_404_4@->addObject(CCString::create(参数值@H_404_4@"@H_404_4@));
CCArray@H_404_4@* arraytype =CCArray::create();
arraytype@H_404_4@->addObject(CCString::create("@H_404_4@));
PublicSendLuaData::getInstance()@H_404_4@->callLuaFuncPar(Lua文件名@H_404_4@"@H_404_4@,0);line-height:1.5 !important;">参数名@H_404_4@ 这个就是具体调用Lua里面一个带参数全局方法的语句;@H_404_4@

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

       if@H_404_4@(typestr->isEqual(CCString::create(404_4@->boolValue()); }@H_404_4@
@H_404_4@

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

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

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

原文链接:https://www.f2er.com/cocos2dx/346190.html

猜你在找的Cocos2d-x相关文章