【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; 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里面一个带参数全局方法的语句; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 数组 – 有效删除Ruby中数组中其他元素的所有子串
- __func__ C 11函数的本地预定义变量,不会编译
- c – 转发一个没有类声明的shared_ptr
- 依赖org.apache.httpcomponents:httpclient:4.4.1因发布而
- Ruby:使用特定值删除散列中的所有键值对
- c# – 为什么resharper建议const,静态操作?
- Swift讲解专题十——类与结构体
- iphone – scrollToRowAtIndexPath不滚动到非活动/卸载的单
- 终于知道cocos2dx的cocos studio是被谁做烂得
- React + Typescript + Webpack 开发环境配置