cocos2d-x lua与c++简单交互
cocos2d-x lua与c++简单交互
version: cocos2d-x 3.6
本文讲述lua与c++的一些简单交互:
- lua通过消息方式调用c++无参接口
- c++调用lua带参接口
1.通过消息方式调用无参接口
接收方监听消息命令,发送方发送消息请求。
- c++层监听消息
//在appdelegate启动时监听
void communication_cpp_lua::registerAllEvent()
{
Director::getInstance()->getEventDispatcher()->addCustomEventListener("LUA_TO_CPP_FACEBOOK_LOGIN", std::bind(&communication_cpp_lua::facebookLogin, this, std::placeholders::_1));
}
void communication_cpp_lua::facebookLogin(EventCustom * evt)
{
CCLOG("lua call cpp facebook login");
//FX::PluginUser *pUser = FX::PluginManager::getInstance()->getPluginUser();
//pUser->setLoginListener(this);
//pUser->login();
}
- lua层发送命令请求
local event = cc.EventCustom:new("LUA_TO_CPP_FACEBOOK_LOGIN")
cc.Director:getInstance():getEventDispatcher():dispatchEvent(event)
请确保lua层发送消息前,c++层以注册了消息监听。
2.c++回调带参数的lua接口
c++调用lua无参数的接口也可使用消息方式,但是当调用带参数接口时,如下为直接调用方式:
- lua层接口 (记得函数要放在全局里面)
-------------------------------------------------------------
-- glocal
-- cpp direct call
-------------------------------------------------------------
-- parm: int string string string string
function cc.exports.onFacebookLogin(retCode, msg, id, name, picture)
print("cc.exports.onFacebookLogin")
-- TODO
end
- c++层调用
注意事项:
- 调用时lua函数所在文件的路径
- 如果参数过多(或为数组),就将参数转为json,那么参数就只有一个了(json字符串)
void communication_cpp_lua::onLoginResult(FX::LoginResultCode ret, const char* msg)
{
CCLOG("INFO: %s ---> retCode = %d, msg = %s", __FUNCTION__, ret, msg);
FX::PluginUser *pUser = FX::PluginManager::getInstance()->getPluginUser();
FX::UserInfo userinfo = pUser->getUserInfo();
//注意函数调用,参数入栈顺序
std::vector<std::pair<std::string,__String*>> parm;
parm.push_back(std::make_pair("number", __String::createWithFormat("%d", ret)));
parm.push_back(std::make_pair("string", __String::create(msg)));
parm.push_back(std::make_pair("string", __String::create(userinfo.id)));
parm.push_back(std::make_pair("string", __String::create(userinfo.name)));
parm.push_back(std::make_pair("string", __String::create(userinfo.picture)));
this->callLuaFuncWithParam("utils/communication_lua_cpp.lua", "onFacebookLogin", &parm);
}
//带参执行Lua方法无返回值
const void communication_cpp_lua::callLuaFuncWithParam(const char* luaFileName, const char* functionName, std::vector<std::pair<std::string,__String*>>* para)
{
lua_State* ls = LuaEngine::getInstance()->getLuaStack()->getLuaState();
int isOpen = luaL_dofile(ls, FileUtils::getInstance()->fullPathForFilename(luaFileName).c_str());
if(isOpen!=0)
{
CCLOG("Open Lua Error: %i", isOpen);
}
lua_getglobal(ls, functionName);
int countnum = para->size();
for (std::vector<std::pair<std::string,__String*>>::iterator itor = para->begin(); itor != para->end(); ++itor)
{
std::string typestr = itor->first;
__String* strnr = itor->second;
if(typestr == "string")
{
lua_pushstring(ls, strnr->getCString());
}
else if(typestr == "number")
{
lua_pushnumber(ls, strnr->intValue());
}
else if(typestr == "bool")
{
lua_pushboolean(ls, strnr->boolValue());
}
else
{
CCASSERT(false, "not surport this type");
}
}
/*
lua_call
第二个参数:函数的参数个数
第三个参数:函数返回值个数
*/
lua_call(ls, countnum, 0);
//lua有返回值
// const char* iResult = lua_tostring(ls, -1);
// return iResult;
}
cocos2d-x lua与c++简单交互的更多相关文章
- Lua基本语法-lua与C#的交互(相当简单详细的例子)
lua脚本 与 C#的交互 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 1 Lua And C# -- ...
- Lua与C的交互
Lua 与 C 的交互 Lua是一个嵌入式的语言,它不仅可以是一个独立运行的程序,也可以是一个用来嵌入其它应用的程序库. C API是一个C代码与Lua进行交互的函数集,它由以下几部分构成: 1. ...
- lua与C/C++交互概要
转 http://blog.csdn.net/wildfireli/article/details/22307635 Lua生来就是为了和C交互的,因此使用C扩展Lua或者将Lua嵌入到C当中都是非常 ...
- Lua脚本和C++交互(一)
现在,越来越多的C++服务器和客户端融入了脚本的支持,尤其在网游领域,脚本语言已经渗透到了方方面面,比如你可以在你的客户端增加一个脚本,这个脚本将会帮你在界面上显示新的数据,亦或帮你完成某些任务,亦或 ...
- lua和C++的交互(1)
/* 以前听的一个故事,当年Java的创造者讲课的时候,一开始先拿一个简单的不能简单的小例子, 不断的扩展,最后成为一个复杂而完美的程序. 一个重要之重要的概念,就是栈.Lua与别的语言交互以及交换数 ...
- lua与c的交互(函数专用)
Lua与C的交互 Lua是一个嵌入式的语言,它不仅可以是一个独立运行的程序,也可以是一个用来嵌入其它应用的程序库. C API是一个C代码与Lua进行交互的函数集,它由以下几部分构成: 1. 读写L ...
- lua Getter&Setter简单实现
lua是一门简单的语言,不带类和属性封装,但可以使用lua强大的元表模拟实现: class.lua local type = type local rawset = rawset local setm ...
- Lua与C/C++交互问题
初学lua,遇到注册C/C++交互函数问题 在lua与C/C++交互时,C/C++的注册Lua函数若是一个有返回类型(压栈)而不是获取类型的时候应该返回1而不是返回0,否则会出现在Lua中值为nil( ...
- Lua与C++的交互
这篇文章说的挺详细的:Lua与C++的交互
随机推荐
- Tkinter教程之Canvas篇(3)
本文转载自:http://blog.csdn.net/jcodeer/article/details/1811922 ''Tkinter教程之Canvas篇(3)''''''16.移动item'''# ...
- String比较
String str1 = "abc"; String str2 = "abc"; String str3 = new String("abc&quo ...
- 解决A program file was not specified in the launch configuration.问题
问题描述: 在eclipse 中开发c++或c是比较麻烦的事情,刚刚配置好mingw32和cdt和环境变量后,新建一个hello world的c++项目还是会出现问题.主要是在编译的时候会提示 ...
- RabbitMQ (三) 发布/订阅 -摘自网络
这篇博客中,我们会做一些改变,就是把一个消息发给多个消费者,这种模式称之为发布/订阅(类似观察者模式). 为了验证这种模式,我们准备构建一个简单的日志系统.这个系统包含两类程序,一类程序发动日志,另一 ...
- 惊艳的随机化方法 -World Search (homework-04)
homeword04-word search 0. 摘要 本次作业,要求完成一个word search的程序,具体要求是: 输入:一个包含20-60个单词的文件,各单词不大于20个字母,无空格. 输出 ...
- html5 标签
按字母顺序排列的标签列表 4: 指示在 HTML 4.01 中定义了该元素 5: 指示在 HTML 5 中定义了该元素 标签 描述 4 5 <!--...--> 定义注释. 4 5 < ...
- vim MiniBufExplorer 插件
MiniBufExplorer安装好久了,但一直没怎么使用过. 今天查了下资料,作为一个备份. 当你只编辑一个buffer的时候MiniBufExplorer派不上用场, 当 你打开第二个buffer ...
- Gym 100507J Scarily interesting! (贪心)
Scarily interesting! 题目链接: http://acm.hust.edu.cn/vjudge/contest/126546#problem/D Description This y ...
- Spring Autowiring by Constructor
In Spring, "Autowiring by Constructor" is actually autowiring by Type in constructor argum ...
- WinAPI: FindWindow、FindWindowEx - 查找窗口
FindWindow( lpClassName, {窗口的类名} lpWindowName: PChar {窗口的标题} ): HWND; {返回窗口的 ...