cocos2d-x Lua绑定C++ 自定义类到Runtime(Lua-binding)

本文主要来自小塔博客这篇文章http://www.zaojiahua.com/binding-custom-classes.html 该文详细清晰地讲述cocos2d-x Lua的一个重要功能,就是Lua读取C++类,用C++类写lua不方便实现的功能,用lua来读取,但是该文是在xcode环境下讲述的,没有说VS怎么配置,其实都差不多,我就转来修改下

我们的需求是:在c++层定义了一些类,我们需要将这些类导出给Lua来使用,从而完成在c++层实现起来容易的需要,这个时候就需要将整个类作为模块导出。而Cocos2d-x正是采用的这种思想,将Cocos中的类导出供用户使用,而不是再写一套Lua代码,用户使用Cocos导出的这套接口,在Lua脚本层写游戏代码。为了更好的理解这部分的内容,可以先看一下在Lua中调用c++函数这篇博客,了解c++中调用Lua的机制。该博客中我们将c++中需要导出的函数放到了一个模块中,其中我们手动的做了一些工作。然而Lua的本质是C,不是C++,Lua提供给C用的API也都是基于面向过程的C函数来用的,要把C++类注册进Lua形成一个一个的table环境是不太容易一下子办到的事。为了实现我们的需求,同样也是官方的需求,在Cocos 2.x版本的时候,使用的是tolua++这个工具,但是这个工具用起来相当的麻烦,耗费体力,所以现在使用的是bindings-generator工具(官方用Python写的一个工具),这个东西底层使用的也应该是tolua++。

我没有使用过tolua++这个工具,不过从网上了解了一下这个工具的使用方法,大致是这样的:1、写自己的c++类,该怎么写就怎么写。2、根据需要导出的c++类的头文件写对应的.pkg文件,具体怎么写得参照tolua++格式。3、写一个桥接的类,只写它的头文件,cpp文件是使用tolua++工具来生成的,头文件具体怎么写,也是需要按照tolua++的格式。4、给这个桥接的类写一个.pkg文件。5、使用命令生成桥接类的.cpp文件。6、程序中使用桥接的类,执行一些先关的函数。所以如果使用的是tolua++工具的话,至少需要写三个文件,导出类的.pkg文件,桥接类的.h文件,桥接类的.pkg文件,可想而知还是比较麻烦的。现在好了,我们有了bindings-generator工具,下面就来具体的使用一下吧。

1、使用Cocos Code IDE建立一个Lua工程,我用的是2.0版,右击工程 Cocos Tool ->选中add native code这个选项,这样会在工程目录下生成frameworks这个文件夹,里边是c++层的代码。



2、进入到frameworks的工程目录下,打开对应的工程,我们用VS打开


3、在VS工程中我们写自己的类,这个类就是你要导出给Lua层用的接口,实际的需求可能是你一直在c++层写代码,某一部分的功能需要在Lua层来实现,这个时候有一些类需要导出给Lua使用,这里我们只是模拟一下,我们在Classes里写一个简单的TestLua类好了。

#ifndef __Test11__TestLua__
#define __Test11__TestLua__

#include "cocos2d.h"

USING_NS_CC;

class TestLua : public Ref
{
public:
    bool init(){return true;};
    CREATE_FUNC(TestLua);
    int show(int);
};

#endif /* defined(__Test11__TestLua__) */
TestLua.h
#include "TestLua.h"

int TestLua::show(int arg)
{
    log("xiaota show %d",arg);
    return arg+100;
}
TestLua.cpp

文件结构在VS像下图这个样子


4、现在需要做的就是导出这个类的接口给Lua使用了。现在进入工程的frameworks/cocos2d-x/tools/bindings-generator目录下,仔细阅读README.md文档,将必须配置的工具和环境变量配置好。不用仔细阅读了,一堆英文看着也很烦呀,主要就是下图:

这里主要就是python2.7,py-yaml和cheetah这三样,libclang是神马玩意我也没管,不装也没事。因为要用到python里的easy-install 工具,此工具不明白怎么装怎么配置的同学可省事的安装python2.7.9或2.7.10,就自带了easy-install工具,还帮你把路径等环境变量配置好了,好了在console命令行运行 easy-install py-yaml和 easy-install cheetah吧,这样就差不多了

然后进入tolua目录,原目录下只有genbindings.py,我把这个文件复制了一份命名为genbindings2.py,然后复制了一个cocos2dx.ini文件,重新命名为xiaota.ini。genbindings.py文件是一个Python脚本,这个脚本在执行的过程中会读取.ini的配置文件,然后根据这些个配置文件生成我们需要的桥接类。

现在我们就来修改一下这两个重要的文件,网上有不少的童鞋没有成功的关键大多数是因为这俩个文件修改的不当所导致的,所以这一步至关重要!如下图所示,output_dir是将生成的桥接类放到哪个文件夹下,我这里放置的地方和引擎将桥接类放置的地方是相同的,cmd_args是在脚本执行的过程中读取的配置文件,我的配置文件是xiaota.ini,所以第一个参数就是xiaota.ini,其中你看到的lua_xiaota_auto这个东西就是最后生成的桥接类的名字。
genbindings2.py修改:

xiaota.ini修改


5、接下来就需要使用Python脚本来生成我们的桥接类了,网上不少的同学最后的结果都是失败,为了排除错误,你可以先运行genbindings.py,看看是否成功,如果不成功那么就是你环境配置的有问题,如果成功再运行自己的genbindings2.py文件,不成功的话80%的错误都是ini配置文件没有配置正确。
在genbindings.py所在目录下打开命令行下(空白处shift+右击,会出现在"此处打开命令窗口菜单")执行 python genbindings2.py,成功如下图:

编译成功,我们可以到刚才生成桥接类的文件夹下看一下这个文件。
根据刚才的配置文件设置,文件在frameworks\cocos2d-x\cocos\scripting\lua-bindings\auto

在那个api目录里还有个TestLua.lua文件,就是全是注释的api声明,那个不用管它。

6、下面我们就使用这个桥接类来将我们的类注册到Lua环境中。打开AppDelegate.cpp文件,包含一下桥接类lua_xiaota_auto.hpp,然后在applicationDidFinishLaunching函数中写如下的代码。


其中的register_all_xiaota就是用来注册类的,它是桥接类中的一个比较重要的函数。

7、为了编译这个桥接类,我们需要将这个新生成的类加入到工程中,此步至关重要。我在这一步耗费了两个晚上的时间来没日没夜的修改,调试。这一步最后试出来跟原文作者不一样,原来两个生成的lua桥接类lua_xiaota_auto.hpp,lua_xiaota_auto.cpp是在cocos\scripting\lua-bindings\auto目录里的,原文为了编译它是把libcocos2d库整个又重编一遍,我照它做了结果又是少Lua51.h又是少lua.c等一堆lua依赖库,又加一堆附加目录死活整不好,而且lua_xiaota_auto.cpp里有一句#include "TestLua.h",我最后把这个lua_xiaota_auto.hpp,lua_xiaota_auto.cpp复制一份与TestLua.h都放到Classes目录下,OK居然编译成功了


8,拿什么编译,我们还是用Cocos Code IDE来编译吧,不要用VS了,成功率还高点

经过这些步骤以后基本就算成功了,跑程序的时候我们使用这个最新的runtime,大家需要明确的一点是当我们改变c++层的代码的时候就需要重新build一下runtime,说白了就是重新编译一下c++的文件,让Lua脚本运行在一个新的环境下。

9. Cocos Code IDE Run菜单 -》edit configuration...来设一下新的Simulator

10、最后一步,打开工程的main.lua,在工程中使用导出来的接口,最终来验证一下是否成功。
local function main()
    collectgarbage("collect")
    -- avoid memory leak
    collectgarbage("setpause",100)
    collectgarbage("setstepmul",5000)

    local val = tt.TestLua:create():show(10)
    print(val)

end


一句话,不经历风雨,怎么见彩虹,经过了这么多步折腾,终于见到了成果,大家好好欣赏下吧,原来不用VS用Cocos Code IDE也是能绑定C++类的

大家找不到Cocos Code IDE 2.0的我分享下http://pan.baidu.com/s/1geyU3B1,此版本最好的地方是可以调试了不像1.0老是出问题,此版有一个重大BUG是代码编辑部分会突然变成插入状态不能编辑了 这时键盘按下 S键即可解决!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


    本文实践自 RayWenderlich、Ali Hafizji 的文章《How To Create Dynamic Textures with CCRenderTexture in Cocos2D 2.X》,文中使用Cocos2D,我在这里使用Cocos2D-x 2.1.4进行学习和移植。在这篇文章,将会学习到如何创建实时纹理、如何用Gimp创建无缝拼接纹
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@163.com微信公众号:HopToad 欢迎转载,转载标注出处:http://blog.csdn.netotbaron/article/details/424343991.  软件准备 下载地址:http://cn.cocos2d-x.org/download 2.  简介2.1         引用C
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从Cocos2D-x官网上下载,进入网页http://www.cocos2d-x.org/download,点击Cocos2d-x以下的Download  v3.0,保存到自定义的文件夹2:从python官网上下载。进入网页https://www.python.org/downloads/,我当前下载的是3.4.0(当前最新
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发引擎,易学易用,支持多种智能移动平台。官网地址:http://cocos2d-x.org/当前版本:2.0    有很多的学习资料,在这里我只做为自己的笔记记录下来,错误之处还请指出。在VisualStudio2008平台的编译:1.下载当前稳
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《最强大脑》娱乐节目。将2048改造成一款挑战玩家对数字记忆的小游戏。邮箱:appdevzw@163.com微信公众号:HopToadAPK下载地址:http://download.csdn.net/detailotbaron/8446223源码下载地址:http://download.csdn.net/
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试以QtCreatorIDE来进行CMake构建。Cocos2d-x3.X地址:https://github.com/cocos2d/cocos2d-x1.打开QtCreator,菜单栏→"打开文件或项目...",打开cocos2d-x目录下的CMakeLists.txt文件;2.弹出CMake向导,如下图所示:设置
 下载地址:链接:https://pan.baidu.com/s/1IkQsMU6NoERAAQLcCUMcXQ提取码:p1pb下载完成后,解压进入build目录使用vs2013打开工程设置平台工具集,打开设置界面设置: 点击开始编译等待编译结束编译成功在build文件下会出现一个新文件夹Debug.win32,里面就是编译
分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net前言上次用象棋演示了cocos2dx的基本用法,但是对cocos2dx并没有作深入的讨论,这次以超级马里奥的源代码为线索,我们一起来学习超级马里奥的实
1. 圆形音量button事实上作者的本意应该是叫做“电位计button”。可是我觉得它和我们的圆形音量button非常像,所以就这么叫它吧~先看效果:好了,不多解释,本篇到此为止。(旁白: 噗。就这样结束了?)啊才怪~我们来看看代码:[cpp] viewplaincopyprint?CCContro
原文链接:http://www.cnblogs.com/physwf/archive/2013/04/26/3043912.html为了进一步深入学习贯彻Cocos2d,我们将自己写一个场景类,但我们不会走的太远,凡是都要循序渐进,哪怕只前进一点点,那也至少是前进了,总比贪多嚼不烂一头雾水的好。在上一节中我们建
2019独角兽企业重金招聘Python工程师标准>>>cocos2d2.0之后加入了一种九宫格的实现,主要作用是用来拉伸图片,这样的好处在于保留图片四个角不变形的同时,对图片中间部分进行拉伸,来满足一些控件的自适应(PS: 比如包括按钮,对话框,最直观的形象就是ios里的短信气泡了),这就要求图
原文链接:http://www.cnblogs.com/linji/p/3599478.html1.环境和工具准备Win7VS2010/2012,至于2008v2版本之后似乎就不支持了。 2.安装pythonv.2.0版本之前是用vs模板创建工程的,到vs2.2之后就改用python创建了。到python官网下载版本2.7.5的,然后
环境:ubuntu14.04adt-bundle-linux-x86_64android-ndk-r9d-linux-x86_64cocos2d-x-3.0正式版apache-ant1.9.3python2.7(ubuntu自带)加入环境变量exportANDROID_SDK_ROOT=/home/yangming/adt-bundle-linux/sdkexportPATH=${PATH}:/$ANDROID_SDK_ROOTools/export
1开发背景游戏程序设计涉及了学科中的各个方面,鉴于目的在于学习与进步,本游戏《FlappyBird》采用了两个不同的开发方式来开发本款游戏,一类直接采用win32底层API来实现,另一类采用当前火热的cocos2d-x游戏引擎来开发本游戏。2需求分析2.1数据分析本项目要开发的是一款游
原文链接:http://www.cnblogs.com/linji/p/3599912.html//纯色色块控件(锚点默认左下角)CCLayerColor*ccc=CCLayerColor::create(ccc4(255,0,0,128),200,100);//渐变色块控件CCLayerGradient*ccc=CCLayerGradient::create(ccc4(255,0,0,
原文链接:http://www.cnblogs.com/linji/p/3599488.html//载入一张图片CCSprite*leftDoor=CCSprite::create("loading/door.png");leftDoor->setAnchorPoint(ccp(1,0.5));//设置锚点为右边中心点leftDoor->setPosition(ccp(240,160));/
为了答谢广大学员对智捷课堂以及关老师的支持,现购买51CTO学院关老师的Cocos2d-x课程之一可以送智捷课堂编写图书一本(专题可以送3本)。一、Cocos2d-x课程列表:1、Cocos2d-x入门与提高视频教程__Part22、Cocos2d-x数据持久化与网络通信__Part33、Cocos2d-x架构设计与性能优化内存优
Spawn让多个action同时执行。Spawn有多种不同的create方法,最终都调用了createWithTwoActions(FiniteTimeAction*action1,FiniteTimeAction*action2)方法。createWithTwoActions调用initWithTwoActions方法:对两个action变量初始化:_one=action1;_two=action2;如果两个a
需要环境:php,luajit.昨天在cygwin上安装php和luajit环境,这真特么是一个坑。建议不要用虚拟环境安装打包环境,否则可能会出现各种莫名问题。折腾了一下午,最终将环境转向linux。其中,luajit的安装脚本已经在quick-cocos2d-x-develop/bin/中,直接luajit_install.sh即可。我的lin
v3.0相对v2.2来说,最引人注意的。应该是对触摸层级的优化。和lambda回调函数的引入(嗯嗯,不枉我改了那么多类名。话说,每次cocos2dx大更新。总要改掉一堆类名函数名)。这些特性应该有不少人研究了,所以今天说点跟图片有关的东西。v3.0在载入图片方面也有了非常大改变,仅仅只是