我们@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@
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@
PublicSendLuaData.h
//@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@
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@
上面都有注释,我就不详细去一一赘述,不过以上方法能满足大部分在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@
那又人问了,如果在Lua中访问C++函数怎么办呢?还记得我文章第一篇中得Lua调用C++函数类的方法呢?@H_404_4@
我提倡使用tolua++工具类去坐Lua访问C++;@H_404_4@