Cocos2d-x3.0下一个 Lua与C++打电话给对方
这里谈下Lua与C++如何实现相互通话
原来的连接:http://blog.csdn.net/qqmcy/article/details/26052771
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
版权声明:本文博客原创文章。博客,未经同意,不得转载。
Cocos2d-x3.0下一个 Lua与C++打电话给对方的更多相关文章
- Cocos2D v2.0至v3.x简洁转换指南(三)
Cocos2D 3.3中的注意事项 如果你在使用Cocos2D 3.3+(是SpriteBuilder 1.3+的一部分)你将不得不替分别的换所有存在的UITouch和UITouchEvent为CCT ...
- JS 如何获取当前上一个月、下一个月和月份所含天数
在数据报表查询中,经常需要设置查询的日期区间,如查询2018-02-01至2018-02-28的整月数据,这时需要提供快捷整月查询按钮: 如: 一般日期年月日之间由"-"或者&qu ...
- solaris X86-64下一个ORACLE战斗11.2.0.3.8在一波折叠补丁
solaris X86-64下一个ORACLE战斗11.2.0.3.8补丁: 正确的步骤: 1.BUG6880880 .OPATCH补丁 2.BUG16902043.11.2.0.3.8补丁 情感是练 ...
- 如何在Cocos2D 1.0 中掩饰一个精灵(六)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 掩饰一个精灵:实现代码 打开HelloWorldLayer.m并 ...
- 如何在Cocos2D 1.0 中掩饰一个精灵(一)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 原帖来自Ray Wunderlich写的精彩的文章 How To ...
- Go 语言的下一个大版本:Go 2.0 被安排上了(全面兼容1.X,改进错误处理和泛型这两大主题)
今年 8 月 Go 开发团队公布了 Go 2.0 的设计草案,包括错误处理和泛型这两大主题.现在备受瞩目的 Go 2.0 又有了新动向 —— 昨日 Go 开发团队在其官方博客表示,Go 2 已经被安排 ...
- 抢先学鸿蒙(HarmonyOS)2.0,你就是下一个大咖!
1. 你不知道的鸿蒙(HarmonyOS) 2020年9月10日,华为开发者大会发布了鸿蒙(HarmonyOS)2.0.我在2020-9-11日也发布了全球首套鸿蒙2.0 App开发视频课 ...
- quick-cocos2dx在eclipse下的lua调试
文中大部分内容来自http://cn.quick-x.com/?p=253,绿色标记部分为修改部分. 配置编译环境的基本步骤: 安装 Visual Studio 2012 安装 Java SDK 安装 ...
- cocos2d-x 2.2.0 如何在lua中注册回调函数给C++
cocos2d-x内部使用tolua进行lua绑定,但是引擎并没有提供一个通用的接口让我们可以把一个lua函数注册给C++层面的回调事件.翻看引擎的lua绑定代码,我们可以仿照引擎中的方法来做.值得吐 ...
随机推荐
- Mybatis 数据库物理分页插件 PageHelper
以前使用ibatis/mybatis,都是自己手写sql语句进行物理分页,虽然稍微有点麻烦,但是都习惯了.最近试用了下mybatis的分页插件 PageHelper,感觉还不错吧.记录下其使用方法. ...
- 基于visual Studio2013解决面试题之0210树的最远距离
题目
- POJ 2632 Crashing Robots (坑爹的模拟题)
Crashing Robots Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6599 Accepted: 2854 D ...
- [Android Studio 权威教程]Windows下安装Android Studio
从AS 0.5版本号開始使用.也是AS的推行者,在ApkBus公布的第一篇Android Studio Perview 2 获得了50K的浏览,1800多条回复下载. 在我的[Android Stud ...
- HDU 4344 随机法判素数(费马小定理
#include <cstdio> #include <ctime> #include <cmath> #include <algorithm> usi ...
- 每天一个JavaScript实例-推断图片是否载入完毕
<!doctype html> <html lang="en"> <head> <meta charset="utf-8&quo ...
- Delphi -- 创建 桌面、发送到...、快速启动栏、开始菜单、程序菜单、右键菜 单
{================================================================= 功 能: 创建 桌面.发送到....快速启动栏.开始菜单.程序菜单 ...
- dumpbin
在使用VC时,可以用DUMPBIN.EXE来得到某个DLL中所输出的符号的清单.如下面的 命令:dumpbin -exports Cmpnt1.dll如: C:/WINDOWS/system32> ...
- oracle数据库、客户端安装以及ps/sql连接和导入表实例
从下面的网址下载http://www.oracle.com/technetwork/database/enterprise-edition/downloads/112010-win32soft-098 ...
- Android本地视频播放器开发--简易播放器原型
在以前的基础上,将音视频进行合并,音频播放采用OpenSL ES,视频播放采用OpenGL ES2.0进行显示,这次的版本其中音频和视频是在同一个线程,会造成音频断断续续,后续会采用音频使用SDL,视 ...