cocos2d-x lua与c++简单交互

version: cocos2d-x 3.6


本文讲述lua与c++的一些简单交互:

  1. lua通过消息方式调用c++无参接口
  2. c++调用lua带参接口

1.通过消息方式调用无参接口

接收方监听消息命令,发送方发送消息请求。

  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();
}
  1. lua层发送命令请求
local event = cc.EventCustom:new("LUA_TO_CPP_FACEBOOK_LOGIN")
cc.Director:getInstance():getEventDispatcher():dispatchEvent(event)

请确保lua层发送消息前,c++层以注册了消息监听。


2.c++回调带参数的lua接口

c++调用lua无参数的接口也可使用消息方式,但是当调用带参数接口时,如下为直接调用方式:

  1. 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
  1. 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++简单交互的更多相关文章

  1. Lua基本语法-lua与C#的交互(相当简单详细的例子)

    lua脚本 与 C#的交互 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 1 Lua And C# -- ...

  2. Lua与C的交互

    Lua 与 C 的交互 Lua是一个嵌入式的语言,它不仅可以是一个独立运行的程序,也可以是一个用来嵌入其它应用的程序库. C API是一个C代码与Lua进行交互的函数集,它由以下几部分构成: 1.  ...

  3. lua与C/C++交互概要

    转 http://blog.csdn.net/wildfireli/article/details/22307635 Lua生来就是为了和C交互的,因此使用C扩展Lua或者将Lua嵌入到C当中都是非常 ...

  4. Lua脚本和C++交互(一)

    现在,越来越多的C++服务器和客户端融入了脚本的支持,尤其在网游领域,脚本语言已经渗透到了方方面面,比如你可以在你的客户端增加一个脚本,这个脚本将会帮你在界面上显示新的数据,亦或帮你完成某些任务,亦或 ...

  5. lua和C++的交互(1)

    /* 以前听的一个故事,当年Java的创造者讲课的时候,一开始先拿一个简单的不能简单的小例子, 不断的扩展,最后成为一个复杂而完美的程序. 一个重要之重要的概念,就是栈.Lua与别的语言交互以及交换数 ...

  6. lua与c的交互(函数专用)

    Lua与C的交互 Lua是一个嵌入式的语言,它不仅可以是一个独立运行的程序,也可以是一个用来嵌入其它应用的程序库. C API是一个C代码与Lua进行交互的函数集,它由以下几部分构成: 1.  读写L ...

  7. lua Getter&Setter简单实现

    lua是一门简单的语言,不带类和属性封装,但可以使用lua强大的元表模拟实现: class.lua local type = type local rawset = rawset local setm ...

  8. Lua与C/C++交互问题

    初学lua,遇到注册C/C++交互函数问题 在lua与C/C++交互时,C/C++的注册Lua函数若是一个有返回类型(压栈)而不是获取类型的时候应该返回1而不是返回0,否则会出现在Lua中值为nil( ...

  9. Lua与C++的交互

    这篇文章说的挺详细的:Lua与C++的交互

随机推荐

  1. 瞬间从IT屌丝变大神——命名规则

    为了避免命名冲突,命名规则如下: 公共组件因为高度重用,,命名从简,不要加前缀. 各栏目的相应代码,需加前缀,前缀为工程师姓名拼音的首字母,例如:海子前缀为“hz_”,分隔符为下划线"_&q ...

  2. PhoneGap,Cordova[3.5.0-0.2.6]:生成Android项目时出现错误(An error occurred while listing Android targets)

    我在升级到Cordova最新版本(3.5.0-0.2.6)后,在生成Android项目(cordova platform add android)时出现错误: Error: An error occu ...

  3. xcode6默认不支持armv7s

    升级到xcode6以后发现,配置里关于Architectures到默认选项只有armv7和arm64.而再次之前xcode5到时代还是有armv7.armv7s和arm64三项的.  xcode5.1 ...

  4. No module named BeautifulSoup

    遇到 No module named BeautifulSoup 错误,但是的确从官方下载了BeautifulSoup,并安装成功. 后来才发现,有两个BeautifulSoup的版本,一个是2012 ...

  5. JSF 2 radio buttons example

    In JSF, "h:selectOneRadio" tag is used to render a set of HTML input element of type " ...

  6. thymeleaf学习

    一.简单表达格式:   thymeleaf的官方参考文档 1.变量的表达式:${...} 2.选择变量表达式:*{...} 3.信息表达:#{...} 4.链接URL表达式:@{...} 二.字面值 ...

  7. 详解Java解析XML的四种方法

    XML现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便.对于XML本身的语法知识与技术细节,需要阅读相关的技术文献,这里面包括的内容有DOM ...

  8. [c++]this指针理解

    #include <iostream> using namespace std; /** * this 指针理解 */ class A{ int i; public: void hello ...

  9. 访问修饰符与可选修饰符static的使用

    在Java中修饰符较多,在这里简单说一说几个访问修饰符的选择使用,和可选修饰符static的使用. 一.访问修饰符:这是Java里用来控制访问类及类的方法.变量的访问权限,从而达到只暴露接口,来隐藏内 ...

  10. 通过yum安装Nagios

    通过yum安装Nagios 2012年04月05日 ⁄ Nagios ⁄ 暂无评论   QQ空间新浪微博腾讯微博人人网更多3   前提先自行安装好Apache+php 测试环境主监控机:CentOS ...