您的位置:首页 > 移动开发 > Cocos引擎

Cocos2d-x3.0下一个 Lua与C++打电话给对方

2015-07-14 17:50 423 查看
这里谈下Lua与C++如何实现相互通话

原来的连接:/article/1640638.html

DJLCData.h 实现类

//
//  DJLCData.h
//  uitestLua
//
//  Created by 杜甲 on 14-5-17.
//
//

#ifndef __uitestLua__DJLCData__
#define __uitestLua__DJLCData__

#include "cocos2d.h"
#include "CCLuaEngine.h"

USING_NS_CC;

using namespace std;

extern "C"{
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"

}

class DJLCData {

public:
static DJLCData* getInstance();

/*
getLuaVarString:调用Lua全局string
luaFilename = lua文件名称
varName = 所要取Lua中的变量名

*/

const char* getLuaVarString(const char* luaFileName,const char* varName);

/*
*  @brief getLuaOneOfTable:调用Lua全局table中的一个元素
luaFileName = lua文件名称
varName = 所要取Lua中的table变量名
keyName = 所要取Lua中的table中某一个元素的Key
*/

const char* getLuaVarOneOfTable(const char* luaFileName,const char* varName,const char* keyName);

/*
*  getLuaVarTable:调用lua全局table
luaFileName = lua文件名称
varName = 所要取的table变量名
(注:返回的是全部的数据)
*/

const char* getLuaVarTable(const char* luaFileName,const char* varName);

/*
callLuaFunction:调用lua函数
luaFileName = lua文件名称
functionName = 所要调用Lua中的函数名

*/

const char* callLuaFunction(const char* luaFileName,const char* functionName);

/***************** lua ->     C++       **************/
void callCppFunction(const char* luaFileName);

private:
static int cppFunction(lua_State* ls);
static bool _isFirst;
static DJLCData* _shared;
const char* getFileFullPath(const char* fileName);

};

#endif /* defined(__uitestLua__DJLCData__) */


DJLCData.cpp

//
//  DJLCData.cpp
//  uitestLua
//
//  Created by 杜甲 on 14-5-17.
//
//

#include "DJLCData.h"
bool DJLCData::_isFirst;
DJLCData* DJLCData::_shared;
DJLCData* DJLCData::getInstance()
{
if (_shared == nullptr) {
_shared = new DJLCData();
}
return _shared;
}

const char* DJLCData::getLuaVarString(const char *luaFileName, const char *varName)
{
lua_State* ls = LuaEngine::getInstance()->getLuaStack()->getLuaState();
int isOpen = luaL_dofile(ls, getFileFullPath(luaFileName));

if (isOpen != 0) {
log("Open Lua Error:%i",isOpen);
return nullptr;
}

lua_settop(ls, 0);
lua_getglobal(ls, varName);
int statesCode = lua_isstring(ls, 1);
if (statesCode != 1) {
log("Open Lua Error : %i",statesCode);
return nullptr;
}
const char* str = lua_tostring(ls, 1);
lua_pop(ls, 1);
return str;

}
const char* DJLCData::getLuaVarOneOfTable(const char *luaFileName, const char *varName, const char *keyName)
{
lua_State* ls = LuaEngine::getInstance()->getLuaStack()->getLuaState();
int isOpen = luaL_dofile(ls, getFileFullPath(luaFileName));
if (isOpen != 0) {
log("Open Lua Error : %i",isOpen);
return nullptr;
}

lua_getglobal(ls, varName);
int statesCode lua_istable(ls, -1);
if (statesCode != 1) {
log("Open Lua Error: %i",statesCode);
return nullptr;
}

lua_pushstring(ls, keyName);
lua_gettable(ls, -2);
const char* valueString = lua_tostring(ls, -1);
lua_pop(ls, -1);
return valueString;
}

const char* DJLCData::getLuaVarTable(const char *luaFileName, const char *varName)
{
lua_State* ls = LuaEngine::getInstance()->getLuaStack()->getLuaState();
int isOpen = luaL_dofile(ls, getFileFullPath(luaFileName));

if (isOpen != 0) {
log("Open Lua Error:%i",isOpen);
return nullptr;
}

lua_getglobal(ls, varName);
int it = lua_gettop(ls);
lua_pushnil(ls);

string result = "";

while (lua_next(ls, it)) {
string key  = lua_tostring(ls, -2);
string value = lua_tostring(ls, -1);
result = result + key + ":" + value + "\t";
lua_pop(ls, 1);
}
lua_pop(ls, 1);
return result.c_str();

}

const char* DJLCData::callLuaFunction(const char *luaFileName, const char *functionName)
{
lua_State* ls = LuaEngine::getInstance()->getLuaStack()->getLuaState();
int isOpen = luaL_dofile(ls, getFileFullPath(luaFileName));

if (isOpen) {
log("Open Lua Error:%i",isOpen);
return nullptr;

}

lua_getglobal(ls, functionName);
lua_pushstring(ls, "shen");
lua_pushnumber(ls, 23);
lua_pushboolean(ls, true);

/*
lua_call
第一个參数:函数的參数个数
第二个參数:函数返回值个数
*/

lua_call(ls, 3, 1);
const char* iResult = lua_tostring(ls, -1);
return iResult;

}

void DJLCData::callCppFunction(const char *luaFileName)
{
lua_State* ls = LuaEngine::getInstance()->getLuaStack()->getLuaState();

/*
Lua调用的C++的函数必须是静态的
*/

lua_register(ls, "cppFunction", cppFunction);
int isOpen = luaL_dofile(ls, getFileFullPath(luaFileName));
if (isOpen != 0) {
log("Open Lua Error:%i",isOpen);
return;
}

}

int DJLCData::cppFunction(lua_State *ls)
{
int luaNum  = (int)lua_tonumber(ls, 1);
char* luaStr = (char*)lua_tostring(ls, 2);
log("Lua调用cpp函数时传来的两个參数:%i,%s",luaNum,luaStr);
/*
返给Lua的值
*/
lua_pushnumber(ls, 321);
lua_pushstring(ls, "shenqi");

/*
返给Lua值个数
*/
return 2;

}

const char* DJLCData::getFileFullPath(const char *fileName)
{
//src//  这里的//是指我的lua文件放在src这个文件夹下
std::string str =  StringUtils::format("src//%s",fileName);

return FileUtils::getInstance()->fullPathForFilename(str).c_str();
}


hello2.lua

function myadd(x, y)
return x + y
end

luaStr = "shenqi"

luaTable = {name = "xiaonan",age = "20"}

function luaLogString(_logStr,_logNum,_logBool)

print("Lua 脚本打印从C传来的字符串:",_logStr,_logNum,_logBool)
return "Call Lua function OK"
end

function call_cpp(_logStr,_logNum,_logBool)
num,str = cppFunction(999,"lua string")
print("从cpp函数中获得两个返回值:",num,str)
end


调用方法:

log("%s",DJLCData::getInstance()->getLuaVarString("hello2.lua", "luaStr"));
log("%s",DJLCData::getInstance()->getLuaVarOneOfTable("hello2.lua", "luaTable", "name"));

log("Table = %s",DJLCData::getInstance()->getLuaVarTable("hello2.lua", "luaTable"));

log("Call Lua Function Back :%s",DJLCData::getInstance()->callLuaFunction("hello2.lua", "luaLogString"));

DJLCData::getInstance()->callCppFunction("hello2.lua");
DJLCData::getInstance()->callLuaFunction("hello2.lua", "call_cpp");


cocos2d: shenqi
cocos2d: xiaonan
cocos2d: Table = name:xiaonan	age:20
cocos2d: [LUA-print] Lua 脚本打印从C传来的字符串:	shen	23	true
cocos2d: Call Lua Function Back :Call Lua function OK
cocos2d: Lua调用cpp函数时传来的两个參数:999,lua string
cocos2d: [LUA-print] 从cpp函数中获得两个返回值:	321	shenqi
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: