网上有很多cocos2d-x lua绑定c++类的接口教程,这篇文章也是总结他们的经验。

其中重点参考了 http://cn.cocos2d-x.org/tutorial/show?id=1295

整个过程步骤很详细,会比较傻瓜式,希望对新手读者入门有用。

教程基本环境:

1.使用引擎是v3.3 beta版本

2.开发环境:OSX Yosemite

3. Cocos code IDE

4. Xcode 6

1、在Mac上用Cocos code IDE 写lua还是比较便利的,我们用cocos code 新建一个工程,命名LuaBindingTest,选择Add Nativie Code(为什么选这个可以去了解一下),工程新建完成后打开运行。如没问题,我们进行下一步。

2、用Xcode打开以上工程,选择ios 模拟器运行,第一次运行会有错误和异常问题,我们修改一下:在Xcode -》General,把Device Orientation的Portrait选项去掉(游戏一般横屏或竖屏),只保留Langscape Left/Right,修改AppDelegate.cpp的applicationDidFinishLaunching方法,注释掉 initRuntime() ,run,应该能看到画面了。

3. xcode中,新建Class类(放在AppDelegate.cpp所在目录),命名MClass,打开cpp,我们随便加一些方法,MClass类执行绑定过程,并导出lua接口。

MClass.h

#ifndef __LUaBindingTest__MClass__

#define __LUaBindingTest__MClass__

#include <stdio.h>

#include "cocos2d.h"

using namespace cocos2d;

class MClass : public Ref
{
public:
bool init()
{
return true;
}
CREATE_FUNC(MClass);
void doLog()
{
CCLOG("MClass 绑定成功!");
}
};

#endif /* defined(__LUaBindingTest__MClass__) */

关于上面的c++类,构造函数是必须写上的

4.  回到工程的Finder下,打开以下这个目录,

。。。 LuaBindingTest ▸ frameworks ▸ cocos2d-x ▸ tools ▸ tolua

我们会看到很多ini文件和一个genbindings.py,ini是引擎模块的lua绑定配置,genbindings.py脚本会配置这些已存在的ini文件然后导出一个c++导出给lua的接口文件(hpp和cpp文件)。为了不干扰引擎现有的lua接口代码,我们依葫芦画瓢,配置一个我们自己项目用到的lua绑定接口。 拷贝 cocos2dx_spine.ini,重命名为game.ini ;拷贝genbindings.py,重命名为genbindings_game.py.  剩下的就是修改这两个文件。

game.ini

修改处:

[game]

prefix = game

#target_namespace,有点命名空间的作用,我举个例子,cocos2dx.ini的这个参数是cc,所以在lua里面调用Director 需要在#前面cc,这个参数可有可无,但建议写了就不要修改,我们这里不写

target_namespace =

headers = %(cocosdir)s/../runtime-src/Classes/MClass.h

classes = MClass 

skip = 

abstract_classes =

genbindings_game.py

只修改第129行

cmd_args = {'game.ini' : ('game', 'lua_game_auto'), \

}

5.  终端,cd 到tolua目录,python genbindings_game.py。

  如果遇到错误,请阅读tolua目录下的 README.mdown文件,参照上面的方法解决(特别注意,需要的是NDK r9b)

6. 上面过程运行成功后我们会得到两个文件 lua_game_auto.cpp 和lua_game_auto.hpp,

   回到Xcode,导入这两个文件,注意导入到 cocos2d_lua_bindings.xcodeproj库工程而不是项目工程!

添加 cocos2d_lua_bindings.xcodeproj 的Header Search Paths.  (小技巧,五个..)

7. 把我们的game模块注册进lua环境中,以往注册,我们需要在AppDelegate里面添加,v3.3之后,这些模块注册过程全部放到

lua_module_register.h里面的lua_module_register 方法中

...
//主要代码
#include "lua_game_auto.hpp" int lua_module_register(lua_State* L)
{
//Dont' change the module register order unless you know what your are doing
register_cocosdenshion_module(L);
register_network_module(L);
register_cocosbuilder_module(L);
register_cocostudio_module(L);
register_ui_moudle(L);
register_extension_module(L);
register_spine_module(L);
register_cocos3d_module(L);
#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS
register_audioengine_module(L);
#endif lua_getglobal(L, "_G");
if (lua_istable(L,-))//stack:...,_G,
{
register_all_game(L);
}
lua_pop(L, ); return ;
}

8. 至此,MClass的绑定过程已完成,我们在main.lua 中测试一下

local test = MClass:create()

test:doLog()

  xcode 运行,看是否打印log,亲测是可以的。如果想在 cocos code运行,需要编译一次 ,工程右键 Cocos tools-》Build custom runtimes(笔者操作之后,Build提示成功,但运行提示MClass 为nil,未解决,还请指教)

注意,如果要删除c++导出到lua的类对象,直接把引用赋为nil就会调用c++类的析构

9.当然,我们一个项目不可能只写一个类导出给lua用,如何实现多个c++类导出给lua呢?过程也非常简单, 这里,我们可以参考引擎的做法如cocos2dx.ini,即把多个类配置到同一个ini文件中。

为了避免需要在ini中引入多个c++头文件,我们新建一个lua_c_export.h文件,把需要绑定的类(自己完成这三个类的代码)的头文件include到这个头文件里,然后game.ini文件只配置这个lua_c_export.h的路径,这样可避免做多余修改,要知道配路径非常容易出错,如果多人协作,更容易混乱。可参考下面的图例

game.ini

 终端,cd 到tolua目录,python genbindings_game.py。我们在lua文件 调用我们绑定的c++类,运行

打印log,下图说明我们多个类绑定成功

以上就是整个lua绑定c++类过程,希望对读者有用!

Cocos2d-x v3.3 lua绑定c++类方法总结的更多相关文章

  1. cocos2dx v3.x lua绑定分析

    打算新项目转到cocos2dx v3上了,下载代码浏览过后发现改动真是非常大,结构性调整很多. 比如tolua绑定这一块,就几乎全翻新了. 胶水代码的生成,改成了全自动式的,通过clang来分析c++ ...

  2. 使用cocos2d脚本生成lua绑定

    这几天要老大要求把DragonBones移到cocos2dx 3.0 里边,并且绑定lua使用接口.因为刚学lua,使用的引擎也刚从2.2改为3.0,各种不熟悉,折腾了好几天才弄完,有空了总结一下 这 ...

  3. cocos2dx的lua绑定

    一.cocos2dx对tolua++绑定的修正 A.c对lua回调函数的引用 在使用cocos2dx编写游戏时,我们经常会设置一些回调函数(时钟.菜单选择等).如果采用脚本方式编写游戏的话,这些回调函 ...

  4. cocos2dx lua 绑定之二:手动绑定自定义类中的函数

    cococs2dx 3.13.1 + vs2013 + win10 1.首先按照<cocos2dx lua 绑定之一:自动绑定自定义类>绑定Student类 2.在Student类中增加一 ...

  5. cocos2dx之lua绑定简析

    一.总原则:c++对象的生命期不依赖lua gc管理,手动创建的对象要手动销毁 二.引擎层在设计上就是支持脚本概念的(也就是说脚本的使用是“侵入式”的),与lua打交道的代码都封在CCLuaEngin ...

  6. cocos2d-x lua绑定解析

    花了几天时间看了下cocos2d-x lua绑定那块,总算是基本搞明白了,下面分三部分解析lua绑定: 一.lua绑定主要用到的底层函数 lua绑定其本质就是有一个公用的lua_Stack来进行C和L ...

  7. cocos2dx lua 绑定之一:自动绑定自定义类中的函数

    cococs2dx 3.13.1 + vs2013 + win10 1.首先定义C++类Student 在cocos2d-x\cocos文件夹下新建一个user_define的文件夹放置两个文件. 注 ...

  8. quick-cocos2d-x 创建自定义lua绑定c++类

    内容主要参考 “在quick-cocos2d-x中添加自定义的类给lua使用” ( http://www.codeo4.cn/archives/746) 1. quick-coco2d-x 使用 to ...

  9. 开源基于lua gc管理c++对象的cocos2dx lua绑定方案

    cocos2dx目前lua对应的c++对象的生命周期管理,是基于c++析构函数的,也就是生命周期可能存在不一致,比如c++对象已经释放,而lua对象还存在,如果这时候再使用,会有宕机的风险,为此我开发 ...

随机推荐

  1. MSChart实例

    MSChart是VS中自带的图表控件,功能比较强大,效果也比较丰富.下面只提供一个例子,以供新接触的朋友参考. 先看下效果图: 看完效果图上代码啦. 使用这个控件需要先在页面注册一下. <%@ ...

  2. .Net 中资源的使用方式

    近期要在小丸工具箱中添加一个启动画面,画面中需要使用一个GIF动图.经过学习和实验,总结了几个读取资源的方式,罗列如下. 一.使用外部资源 Image img = Image.FromFile(&qu ...

  3. 51nod1089最长回文子串V2

    1089 最长回文子串 V2(Manacher算法) 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 回文串是指aba.abba.cccbccc.aaaa这种左右对称的字 ...

  4. 001.XE3添加TPerlRegEx

    TPerlRegEx 官方下载地址:http://www.regular-expressions.info/download/TPerlRegEx.zip 下载解压,打开pcre.pas文件可看到,直 ...

  5. 对于python WSGI的理解

    首先看看WSGI的目的是什么? 是用来定义一个统一的接口. 这个接口是针对Web服务器和python Web应用之间的. 以增加Python web应用在不同Web 服务器之间的可移植性. 也就是说如 ...

  6. Java 内存区域

    Java虚拟机锁管理的内存包括以下几个运行时数据区域: 1.程序计数器: 程序计数器是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器.在虚拟机的概念模型里,字节码解释器工作时 ...

  7. 原生 JavaScript 图片裁剪效果

    图片裁剪程序效果如下,可鼠标操作.   拖动左边小方框时在右侧实时显示对应的裁剪图片,同时左侧的拖动框里图片完全显示,拖动框外部图片模糊显示.8个控制点可以对显示区域大小进行控制. HTML 和 CS ...

  8. SQL2008附加数据库提示错误:5120

    前几天在附加数据库时,出现了这个错误           在win7 x64系统上使用sql2008进行附加数据库(包括在x86系统正在使用的数据库文件,直接拷贝附加在X64系统中)时,提示无法打开文 ...

  9. py2exe把python程序转换exe

    1.首先下载py2exe:https://sourceforge.net/projects/py2exe/ 2.假设要打包的python 文件放在C:\packet路径下 如 果你有一个名为myscr ...

  10. U盘、移动硬盘提示格式化的处理

    移动硬盘突然打不开了,一点击就提示要求格式化,这种问题本人亲历,现已解决,千万别格式化,千万别格式化,用系统自带磁盘恢复 CHKDSK命令即可解决此问题 方法/步骤 1.在开始菜单找到“运行”窗口,也 ...