游戏开发(四) 之 tolua 实现 lua与c++ 互调 以及详细使用

本文介绍了一个简化版的Lua与原生代码交互框架,重点讲解了tolua的使用及其实现细节,探讨了为何在游戏开发中需要从Lua层调用原生层,并分享了作者在实际项目中采用的C++作为中间层的实践经验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

mvc框架弄完了,接下来开始做lua与原生的调用. 

看了下博客,发现大部分人写tolua的内容,都是按照官方的教程走了一遍tolua,没有涉及到这个地方的作用,以及具体实现,我这篇文章会将binding的过程简化,详细解释使用方法,主要告诉大家我现在搭框架的时候,为什么会把这个东西列出来,先实现好.

本来想直接使用cocos本身自带的 lua调用oc lua调用java,我用了一下,发现接口太少,无法满足使用需求,所以还是传统的使用c++做中间层,然后实现调用原生.今天先做tolua,与oc 和 java调用也比较简单,后面有可能会去实现

为什么要从lua层调回原生层?

这里主要有一下几个原因:

1.在早几年,cocos没有得到各大厂商的重视,所以在其他SDK中,只有ios android 以及unity的接口实现,所以在cocos中,需要使用tolua达到调用原生,然后通过原生调用SDK的API.

2.还有一些程序需要将游戏其他功能模块封装到c++中,比如网络,IO等一系列功能

3.复杂的算法,之前有写过一个较为复杂的A*算法,在lua层的效率实在是无法接受,所以只能在c++来实现算法,将结果发给lua使用.

 

START:

  1. 找到目录 \frameworks\cocos2d-x\tools\tolua,打开README,里面有详细的说明
  2. 我这里是windows系统,之前用mac没有成功,各种奇葩问题,真的想骂娘,这里写几个重点,
    • android-ndk-r16  一定要用这个!!!!!!
    • python2.7.3 (32bit)  32位!!!!!!!!!!!
    • pyyaml 以及 Cheetah 使用提供的下载链接下载
    • `PYTHON_BIN` 就是python.exe的路径

其他就没什么了,跟着步骤走,改ini可以去别的博客看,没什么难度

开始看代码:

先说下大概情况:我这里只写了两个函数,

1.c++ 调用 lua 

2.lua 调用 c++

只有这两个函数!!!! 

这个跟个人喜好有关,有的人喜欢使用一个功能,就映射出一个方法,我的目的是达到快速开发,并且让其他程序无需操心这块内容,

所以只有两个基础方法,具体的功能模块,根据方法的参数(key)来区分,分别在c++或者lua中,做分类处理.这样做的好处就是,你在项目开始的时候 只需要实现过一次就好,不需要频繁的改动c++

c++ 代码:


XXToLua XXToLua::m_instance;

XXToLua::XXToLua()
{

}

string XXToLua::SendDataToLua(string _data)
{
    log("CPlusSendDataToLua key:%s", _data.c_str());

    auto engine = LuaEngine::getInstance();
    engine->executeString("XXCPlusCall(\"123\")");

    return "";
}

string XXToLua::GetDataByLua(string key,string _data)
{
    log("SendDataToLua %s|%s",key.c_str(),_data.c_str());

    SendDataToLua("789");

    return "GetDataByLua";
}

XXToLua这个类为一个单例

SendDataToLua()

        这个地方是使用cocos提供的函数,会调用lua的全局方法,达到c++调用lua

GetDataByLua()

        这里是lua调用c++的方法,参数分别代表 类型以及数据,代码实现部分可以根据key的类型,做不同处理.

lua 代码:

local XXCPlusCall = function( msg )
	XXLog(" XXCPlusCall------------> " .. msg)
end

local XXCallCPlus = function(_type,msg)
	return XXToLua:getInstance():GetDataByLua(_type,msg)
end

cc.exports.XXCPlusCall = XXCPlusCall

怎么样 调用 和 接收  是不是都很简单, 其他具体业务逻辑,就可以单独封装下使用了,也保证了这块代码完全不涉及业务逻辑

简单说下这个地方可扩展的内容,就是这个数据参数,如果你的结构复杂,可以将这个string接收后,统一处理成字典,通过解析字符串转成字典,这样使用起来就会方便一些.

因为这里还没有做具体游戏,所以先简单实现功能,后面如果数据复杂我也会贴出encode,decode的代码.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值