cocos2d-x中lua与C++,C语言互相调用

Cocos2d-x Lua绑定技术探究 Cocos2d-x 是一款广泛用于移动游戏开发的开源框架,由 Cocos2d 引擎发展而来。它支持多种编程语言,包括 C++、JavaScript 和 Lua。Cocos2d-x 以高效、易用、可扩展性好著称,被许多开发者用于跨平台游戏的开发。Lua是一种轻量级的脚本语言,它由巴西里约热内卢天主教大学(Pontifícia Universidade Católica do Rio de Janeiro, PUC-Rio)于1993年创建。 阅读详情

研究他们之间的通信对我来说主要是是为了解决在lua中使用protobuff,可以把网络部分放在C++中编写,lua只要把protobuff生成的字符串转给C++网络库就可以了。其实lua与C++和与C语言的相互调用是一样,调用C++其实也是把C++的对象指针当成C语言函数指针用的。
我这里是把需要lua调用的C++方法封装到C语言函数中,然后将这个C语言函数注册进lua库中。这样lua就可以轻松调用C语言方法了,就和调用自已的lua脚本是一样一样的。
因为在cocos2d-x中现在都流行使用lua开发游戏。一直作C++,很排斥用lua脚本写来游戏。如果真要用脚本,我宁愿是

ChaiScript的C++脚本。但与自已合作的朋友们都是只精通lua脚本。

无奈之下,研究了一下lua与C++,C的相互调用。

什么也不说了,直接上代码了。
第一部分,C语言函数。
//luaCfunc.h文件,要在lua中注册的C语言头文件

#ifndef luaCFunc_h
#define luaCFunc_h

#include <stdio.h>
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"


int loadLuaScript(lua_State* Ltmp);
int luaCallCpp(lua_State* L);
int cppCallLua(int ptype,const char* msg,int isPush);

#endif /* luaCFunc_h */


//luaCfunc.c,在lua中注册C语言的函数以及注册和lua调用C语言的方法.

//
// luaCFunc.c
// luatest
//
#include "luaCFunc.h"
//testlua.c

#include <stdio.h>

#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"

extern const char* getLuaCallCppPath();

lua_State* L;

int netSend(lua_State* L)
{
//从L栈中取出索引为1的数值,并检查
int x = luaL_checkint(L,1);
//从L栈中取出索引为2的数值,并检查
const char* y = luaL_checkstring(L,2);
printf("result:%d,str=%s\n",x,y);
return 1;
}

int loadLuaScript(lua_State* Ltmp)
{
L = Ltmp;
//初始化全局L
//打开库
luaL_openlibs(L);
//把函数压入栈中
lua_pushcfunction(L, netSend);
//设置全局ADD
lua_setglobal(L, "NetSend");
printf("lua path=%s\n",getLuaCallCppPath());
//加载我们的lua脚本文件
if (luaL_loadfile(L,getLuaCallCppPath()))
{
printf("error\n");
}
//安全检查
lua_pcall(L,0,0,0);
return 0;
}


int cppCallLua(int ptype,const char* msg,int isPush)
{
//push进lua函数
lua_getglobal(L, "NetRecive");
lua_pushnumber(L, ptype);
lua_pushstring(L, msg);
lua_pushboolean(L, isPush);

if (lua_pcall(L, 3, 0, 0) != 0)
{
printf("error running function netrecive\n");
}

printf("lua p=%d,%s,%d\n",ptype,msg,isPush);

printf("hello my lua\n");
return 0;
}


这里说明一下,C语言本身自已调用C语言其他文件的函数时并不用加入#include "xxx"这样的字段,只要使用extern这样的方法引用一下外部函数就可以在当前文件中调用了,C语言函数之间的连接问题全部由编译器管理了。像下边这样,是C语言调用其他C语言函数的方法前的引用,当然这个方法也可以是在.cpp文件里实现的C语言。这就是C语言调用C++和C++调用C语言的法宝。
 extern const char* getLuaCallCppPath();

//CCallCppTool.hpp,C语言调用C++的工具头文件,

   
#ifndef LuaCallCppTool_hpp
#define LuaCallCppTool_hpp

#include <stdio.h>

extern "C" {
    const char* getLuaCallCppPath();
}
const char* getLuaCallCppPath();
#endif /* LuaCallCppTool_hpp */
上边的代码中,你会发现多了一个
extern "C" {
    const char* getLuaCallCppPath();
}
这个其实是为了告诉C编译器这个文中包含的C语言部分。extern "C" { }中包含的部分只对C语言编译器可见,所以这里看起来好像定义了两次。
//CCallCppTool.cpp,实现文件,是一个cpp中的C语言函数.


#include "LuaCallCppTool.hpp"
#include "cocos2d.h"
const char* getLuaCallCppPath()
{
std::string strtmp = cocos2d::FileUtils::getInstance()->fullPathForFilename("src/luaCtool.lua");
return strtmp.c_str();
}

然后还有一部分是在初始化应用程序时要初始化一下lua脚本。所以在移动应用开发的程序起动时运行的方法,也就是
 bool AppDelegate::applicationDidFinishLaunching()
方法中,我加入了我的C语言初始化lua脚本的部分。
调用之前,先要引用一下这个函数。像下边这样在cpp文件中引用C语言的函数。

extern "C" {
#include "luaCFunc.h"
}

然后就是在 bool AppDelegate::applicationDidFinishLaunching()中调用

loadLuaScript(L);

来初始化lua脚本。
最后的部分是我们的lua脚本了,这里使用截图吧,有lua的语法高亮:
cocos2d-x中lua与C++,C语言互相调用 - ♂苹果 - 眼睛想旅行
 
用的cocos2d-x版本是3.8.1。
Cocos2d-x引擎与Lua脚本打造飞机大战游戏实战 Cocos2d-x基于Cocos2d-iPhone,经过C++重写,使得它具有更高的性能和更广泛的平台兼容性。开发者通过Cocos2d-x能够实现2D游戏和应用的开发,并且享受到一个成熟的框架带来的便利,例如,场景管理、动画系统、粒子系统等。游戏架构设计在任何游戏开发过程中都是一个核心环节,它不仅关系到代码的组织结构,还对游戏的可扩展性、性能和维护性产生深远影响。一个良好的游戏架构能够确保团队成员间的协作更为顺畅,减少冗余代码,提高代码的复用性,同时也为后续的游戏迭代和扩展打下坚实的基础。 阅读详情

相关推荐

实现luaplus和c++之间的互调

实现了lua中调用c++的类成员方法,普通方法;c++调用lua中的变量和方法,采用luaplus源码引入,在win7+vs2010/vs2015+win32命令行模式下编译通过

Cocos2d-x开发中C++内存管理详解

由于开始并没有介绍C++语言,C++的内存管理当然也没进行任何的说明,为了掌握Cocos2d-x中的内存管理机制,是有必要先了解一些C++内存管理的知识。 C++内存管理非常复杂,如果完全地系统地介绍可能需要一本书的篇幅才能解释清楚。这里只给大家介绍C++内存管理最为基本的用法。 内存分配区域 创建对象需要两个步骤:第一步,为对象分配内存,第二步,调用构造函数初始化内存。在第一步中对象分配内存时候,我们可以选择几个不同的分配区域,这几个区域如下: 栈区域分配。栈内存分配运算内置于处理器的指令集中,效

翻肚鱼儿的博客 339

从T型结到Wilkinson:5分钟搞懂功分器选型指南(附最新射频测试数据对比)

本文通过对比T型结、电阻型和Wilkinson三种功分器的核心原理与实测数据,提供了清晰的射频功分器选型指南。文章结合最新的2.4GHz ISM频段测试数据,分析了插入损耗、回波损耗和端口隔离度等关键指标,并针对窄带物联网、射频测试及合成系统等不同应用场景,给出了具体的选型建议和实战提醒,帮助工程师根据系统需求做出最优决策。

bush的博客 305

使用cocos2d-x c++ Android静态库

在用cocos2d-x做Android开发时,每次clean后都会需要再次编译coco2d-x的库,十分耗时。 这里给出一个直接使用静态库而不用每次都编译源码的方法: 1\ 首先找到一个cocos2d-x的测试项目(如cpp_test),进行一次编译。完成后,在proj.android/obj/local目录下可以找到中间过程中生成的所有静态库文件。 把这些静态库文件(带上ABI

yixiao3660的专栏 794

grafana使用方法

1、点击仪表盘2、新建仪表盘3、选择数据源4、选择查询的条件5、美化。

2403_87359664的博客 323

王爽《汇编语言》课程设计2(不涉及软盘版本)

assume cs:code,ds:data,ss:stack stack segment db 128 dup (0) stack ends data segment db 256 dup (0) data ends code segment start: mov ax,stack mov ss,ax mov sp,128 ...

weixin_41944412的博客 1178

以cocos2d-x之名:c++知识回顾一

做了一年的java ,C++几乎要忘光了...这可是自己大学期间

桂子的博客 1247

易灵思Ti60F100 FPGA的HyperRAM实战:从硬件连接到Native接口时序调试

本文详细介绍了易灵思Ti60F100 FPGA内置HyperRAM控制器的实战应用。文章从硬件设计要点(如400MHz+信号完整性、等长匹配)切入,重点解析了如何通过Interface Designer配置高效的Native接口,并分享了其时序详解与调试技巧,为开发者提供了一份从硬件连接到软件调试的深度指南。

weixin_29168153的博客 457

cocos2dx之Lua调用C++

现在cocos2dx3.8自己封装了以前的toLua++,比以前更好用了。 先来看一下整体步骤: 1.编写一个.ini文件。 2,修改genbindings.py脚本。 3,执行genbindings.py脚本。 4,将生成的桥接文件加入工程。5,修改lua_module_register.h。6,Lua中的使用 原文地址:http://blog.youkuaiyun.com/dingkun520wy/...

weixin_34310369的博客 265

UE4初学笔记_02_编辑器界面

不同版本可能不一样,这里是4.25 UE4编辑器主界面(也称为关卡编辑器)主要用于构建世界场景和关卡以及放置资源。 1.菜单栏 2.关卡编辑器(Level Editor)工具栏 3.“模式”(Modes)面板 4.“内容浏览器”(Content Browser)面板 5.“视口”(Viewport)面板 6.“世界大纲视图”(World Outliner)面板 7.“细节”(Details)面板 1.菜单栏 菜单栏包含“文件”(File) 、“编辑”(Edit) 、“窗口”(Win.

来自火星的猫 3093

文本分析-使用jieba库进行中文分词和去除停用词(附案例实战)

本文将手把手教会你使用jieba库进行中文分词和去除停用词,这是学会文本分析的必经之路!

m0_64336780的博客 4万+

cocos2dx C++工程中使用lua脚本(二):C++调用lua脚本(一)

首先在使用Lua脚本之前,先讨论下什么样的情况下需要用到C++和lua混合开发。 cocos2dx有C++版本、Lua版本、JS版本(使用这部分的开发者估计现在都转向cocos creator了吧)。 纯C++开发: 优点:由于cocos2dx使用c++编写的开源引擎,若是C++开发,更容易接触到引擎底层,可以根据实际需求修改引擎;同时也可以学习引擎组大佬们的优质代码。 缺点:1、无法热更...

三思而先行的博客 1149

LVGL 磁罗盘效果

环境:LVGL 9.x + SDL2,窗口 1280×800。界面文案用英文(默认 Montserrat,无 CJK)。本文按实现顺序讲:先建立两个耦合转动体,再把磁倾角误差从卡面倾斜里推出来,最后用同一套投影把刻度、数字和目标画到卡上。画面上的迟滞、涡流、摆动和读数偏差都来自方程,没有补间动画。

摸鱼专家 88

cocos2dx java 调用lua_总结关于lua, c , android,在 cocos2d-x 之间的调用方法

把这几天瞎搞的东西总结一下.环境配置什么的也比较烦. ndk.java.在cocos2dx的环境中都有配置.参1很基础很基础很基础的环境配置.1.android与C 之间的调用android通过JNI 来调用C(不带C++玩.extern "C"),1.1android调用C如果要在Eclipse中用C/C++编译要在工程上选android tools 的add native support,来编...

weixin_33908906的博客 672

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Cocos2d-x 之 Lua 编程之路 · 开篇2 · 游戏环境搭建

Cocos2d-x 之 Lua 编程之路 · 开篇 · 游戏环境搭建上一篇:Cocos2d-x 之 Lua 编程之路·开篇·环境变量配置 好了,今天我们继续 cocos2d-x-lua 的游戏环境的搭建 首先到cocos官网下载最新版本的 Coco2d-x 项目源码,并解压到一个目录下。例如,我就是直接放在D盘目录下: 找到 cocos2d-x 项目中的 stetup.py 文件,双击,运

猿小泽的博客 1496

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Cocos2d-x中用Lua实现剪切板的文字复制粘贴(iOS篇)

这个问题搞死我了……弄了好久才弄好。看上去其实挺唬人的,需要从Lua调到C++,再调到OC,其实仔细分析一下的话还好。我们下面开始讲解: 首先是Lua调到C++(如果直接是C++的项目请无视): 首先,我们在项目里建一个ClipboardHelper.cpp,一个ClipboardHelper.hpp(.h的也可)。 .hpp中我们声明一个想让Lua调用的函数: #ifndef C

Schrodinger 8549

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Cocos2d-lua(三)认识Cocos2d-lua

简单了解下Cocos2d-lua,它的前世我记不清了,今生我还是了解,Cocos 的官网:http://www.cocos.com/,我第一次知道Cocos的时候是在2014年8月,当时cocos2d-x 3.0已经出来了,2 到3引擎修改了很多(具体的可以到官网看看)。在工作时经常有2版本的,现在很少用2版本开发了,如果有,多半工作是维护优化(改修改别的代码是比较恶心的,我也是拒绝的),添加新功

小飞飞的博客 6366

cocos2dx java 调用lua_Cocos2d-x Lua实现从Android回调到Lua的方法

最近在研究怎么把积分墙嵌入到Cocos2d-x Lua的里,折腾了几天,总算调通了,主要要解决的问题是,调用积分墙之后,当积分发生改变的时候,有一个回调方法,回调会返回用户还剩下多少积分,当Android收到这个回调的时候,需要把这个通知给lua做对应的处理,我就是在这里卡住了。先理一下思路要实现上面提到的回调通知lua,首先要实现Android回调给C++,再从C++去调用Lua的方法。一步一步...

weixin_42537499的博客 415

在cocos2d-x中使用LUA

在cocos2d-x中使用LUA 1、注冊LUA脚本引擎 CCLuaEngine* pEngine = CCLuaEngine::defaultEngine(); CCScriptEngineManager::sharedManager()->setScrip...

weixin_30858241的博客 155

[转]Cocos2d-x下Lua调用自定义C++类和函数的最佳实践

【转自】https://segmentfault.com/a/1190000000718145 关于cocos2d-x下Lua调用C++的文档看了不少,但没有一篇真正把这事给讲明白了,我自己也是个初学者,摸索了半天,总结如下: cocos2d-x下Lua调用C++这事之所以看起来这么复杂、网上所有的文档都没讲清楚,是因为存在5个层面的知识点: 1、在纯C环境下,把C函数注册进Lua环境,理解Lua和C之间可以互相调用的本质 2、在cocos2d-x项目里,把纯C函数注册进Lua环境,理解cocos2d

ffxiangyu的专栏 593

cocos lua调用java_Cocos2d-x下Lua调用自定义C++类和函数的最佳实践

关于cocos2d-x下Lua调用C++的文档看了不少,但没有一篇真正把这事给讲明白了,我自己也是个初学者,摸索了半天,总结如下:cocos2d-x下Lua调用C++这事之所以看起来这么复杂、网上所有的文档都没讲清楚,是因为存在5个层面的知识点:1、在纯C环境下,把C函数注册进Lua环境,理解Lua和C之间可以互相调用的本质2、在cocos2d-x项目里,把纯C函数注册进Lua环境,理解cocos...

weixin_34986860的博客 381

Cocos2d-x下Lua调用自定义C++类和函数的最佳实践

关于cocos2d-x下Lua调用C++的文档看了不少,但没有一篇真正把这事给讲明白了,我自己也是个初学者,摸索了半天,总结如下: cocos2d-x下Lua调用C++这事之所以看起来这么复杂、网上所有的文档都没讲清楚,是因为存在5个层面的知识点: 1、在纯C环境下,把C函数注册进Lua环境,理解Lua和C之间可以互相调用的本质 2、在cocos2d-x项目里,把纯C函数注册进Lua环境,理

yueyuanchang的专栏 701

Cocos2d-x多语言项目创建指南:从CPP到Lua的工程模板选择技巧

本文详细解析了Cocos2d-x多语言项目创建中的CPP、Lua和JS三种模板的技术差异,特别对比了Lua模板中default与runtime版本的关键区别。通过实战案例和性能对比,帮助开发者根据项目需求选择最合适的工程模板,提升开发效率和运行性能。

ii567的博客 798

Cocos2d-x Lua实现从Android回调到Lua的方法

最近在研究怎么把积分墙嵌入到Cocos2d-x Lua的里,折腾了几天,总算调通了,主要要解决的问题是,调用积分墙之后,当积分发生改变的时候,有一个回调方法,回调会返回用户还剩下多少积分,当Android收到这个回调的时候,需要把这个通知给lua做对应的处理,我就是在这里卡住了。 先理一下思路要实现上面提到的回调通知lua,首先要实现Android回调给C++,再从C++去调用Lua的方法。

asd131531的专栏 1247

Cocos2d-x 最新离线API文档下载(C++,JS,Lua合辑)

Cocos2d-x 最新离线API文档下载(C++,JS,Lua合辑) 其实使用doxygen在Cocos2d-x引擎的doc目录下可以生成离线文档,但是可能每个人为了生成一个离线文档去安装甚至编译doxygen毕竟麻烦,而且现有的doxygen无法生成多语言版本的离线文档。所以为了大家用起Cocos2d-x更方便,在子龙山人的帮助下,我把最新多语言版Cocos2d-x的离线文档给整理出来了。

yangchuankai's blog 3820
上一篇: 如何用python实现一个多线程定时器
下一篇: python写入mysql中文乱码问题
woodcol
博客等级 码龄19年 288粉丝 429原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值