展会信息港展会大全

Cocos2d-x3.0下 Lua与C++相互调用
来源:互联网   发布日期:2015-09-27 14:59:48   浏览:1189次  

导读: 这里讲下Lua与C++之间如何实现相互调用 DJLCData.h 实现类 // // DJLCData.h // uitestLua // // Created by 杜甲 on...

这里讲下Lua与C++之间如何实现相互调用

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 +;

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</pre>

赞助本站

人工智能实验室
AiLab云推荐
推荐内容
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港