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++的交互
随机推荐
- [转]JQuery.Ajax之错误调试帮助信息
下面是Jquery中AJAX参数详细列表: 参数名 类型 描述 url String (默认: 当前页地址) 发送请求的地址. type String (默认: "GET") 请求 ...
- iOS完结篇
从去年自己陆陆续续接触iOS开发,几个月过去了,对于苹果的体验,流程,以及规范都有了一定的认 识,还会定期关注iOS的发展. 即将要做win10系统了,为了纪念把自己的虚拟机截图留念吧.也希望微软能在 ...
- HDU-4726 Kia's Calculation 贪心
题目链接:http://acm.hdu.edu.cn/userstatus.php?user=zhsl 题意:给两个大数,他们之间的加法法则每位相加不进位.现在可以对两个大数的每位重新排序,但是首位不 ...
- homework-07
终于等到了一次难度相对比较小的问题,只要读完提问题就好,但又不得不说自己真的很菜,且不说C++掌握的不好,连英文也比较差,导致读的非常吃力,不过我还是坚持读完了四篇英文文章,大致意思是可以了解的,但是 ...
- Android实例-获取安卓手机WIFI信息(XE8+小米2)
结果: 1.必须打开Access wifi state权限,不打开权限会出图二的错误. 相关资料: http://blog.csdn.net/lyf_lyf/article/category/1735 ...
- HDU 1142 A Walk Through the Forest (求最短路条数)
A Walk Through the Forest 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1142 Description Jimmy exp ...
- eclipse svn切换账号登陆问题
1.当一个人有权限访问文件代码,而另一个账号无法访问该文件代码,要在eclipse上切换账号登陆有权限的账号时,eclipse会用缓存的账号,不会弹出从新输入新账号的窗口. 这样该怎么解决呢? 关闭e ...
- codeforces300A Array
A. Array time limit per test 2 seconds memory limit per test 256 megabytes input standard input outp ...
- 咏南DATASNAP中间件提供免费使用了
咏南DATASNAP中间件提供免费使用了. 百度网盘分享: 链接: http://pan.baidu.com/s/1c06Ivp2 密码: dhhm
- Umbraco中的Member登录时的Lock out功能
请参看文章 https://our.umbraco.org/forum/using-umbraco-and-getting-started/76389-preventing-member-lock-o ...