一. 简单介绍

文章介绍是在实际的游戏开发项目中,将自定义的C++类绑定到lua中,能够让lua调用c++类。会创建一个python脚本,执行python脚本会让自动将我们的c++类绑定到lua。生成我们要的代码。文章会介绍配置环境、编写脚本、测试类、实际项目中调用,以及一些遇到的问题

二.兵马未动粮草先行

当前我用的是quicklua 3.3 win7系统。下载需要的工具

可以先看一下 \tools\tolua \README.mdown里面有详细介绍,而且都有下载地址

我现在是win系统,翻译一下

(1). 要保证你的ndk是 android-ndk-r9b,配环境变量

(2). Python 2.7.3(32bit),配置环境变量,自己在网上查

安装pyyaml 我之前安装失败是因为python版本不对,然后改成上面的

(3).pycheetah  解压到你python文件下lib\site-packages

具体可以参考 http://cn.cocos2d-x.org/tutorial/show?id=2518

三.创建一个头文件类CustomHeaders.h

在 项目的\frameworks\runtime-src\Classes创建一个类,就是项目放classes的地方.

批量绑定的时候用,具体作用后面会讲到,可以创建一个例子

/*
手动添加需要绑定到lua的类头文件
*/
#ifndef __CUSTOMHEADERS_H__
#define __CUSTOMHEADERS_H__
//...导入我们需要绑定的类的头文件
#include "MyTestClass.h"//example
#include "MyTestClass2.h"//example

#endif

四.几个测试类

我们需要绑定到lua的类。这里我写了两个测试类MyTestClass 和MyTestClass2。如

MyTestClass2.h

#ifndef __MYTESTCLASS2_H__
#define __MYTESTCLASS2_H__
#include "cocos2d.h"
class MyTestClass2
{
public:
static int getTestData();
private:
};
#endif

MyTestClass2.cpp

#include "MyTestClass2.h"
int MyTestClass2::getTestData()
{
int a = 22222;
return a;
}

两个都差不多。就是返回整数。

五.写一个python脚本,和一个ini

\tools\tolua文件夹下的genbindings.py复制一份。我们重新起名咱们用的py。

\tools\tolua文件夹下的任意一个ini文件复制一份。我们可以重新起名为我们用的配置文件比如myclass.ini

这里我该成myclass_genbindings.py。名字随便。有两个地方需要改然后找到

(1)修改py

1.output_dir = '%s/cocos/scripting/lua-bindings/auto' % project_root

将输出路径改为咱们自己的classes文件夹下。可以根据自带的路径写出自己的路径例如:

output_dir='%s/project/cardgame/frameworks/runtime-src/Classes' % project_root。

组装的路径。project_root当前项目的目录,然后加上后面你自己的classes路径

当然可以在classes文件夹下创建一个auto文件夹,来存放自动生成的文件,我这里没有创建

2.

cmd_args = {'cocos2dx.ini' : ('cocos2d-x', 'lua_cocos2dx_auto'), 。。。
}

改成:

cmd_args = {'myclass.ini' : ('myclass', 'lua_myclass_auto')}

第一个参数是之前的ini文件。 第二个后面要用到。第三个是脚本生成的文件的名字lua_myclass_auto

(2)修改ini

1.将第一行改成 [上面的第二个]比如[myclass]

2.prefix = myclass

3.target_namespace =什么什么的改成 target_namespace =

注:后面会讲到=空或者=其他的原因

4.headers = 什么什么的   改成咱们上面写的CustomHeaders.h的路径,可以根据已经有的路径拼接处咱们的路径

如:%(cocosdir)s/project/cardgame/frameworks/runtime-src/Classes/CustomHeaders.h

5、classes = 咱们需要绑定的类的名字 ,如

classes = MyTestClass MyTestClass2  可以支持多个。需要在CustomHeaders.h文件中导入自定义类的头文件,然后在classes=后面添加上类名就 可以

OK了。我们 cd 到myclass_genbindings.py脚本的文件夹下,执行脚本 python myclass_genbindings.py 就可以自动绑定拉。

小技巧:在文件夹,按住shift+鼠标右键,可以看到 在此处打开命令窗口,比较方便、

六.上面写ini简单介绍

1、首先必须了解正则表达式,百度直接搜索正则表达式

2、关键参数
prefix 关系到lua函数开头的名字,如prefix=cocos2dx,那么生成的代码就是以lua_cocos2dx开头
target_namespace 表面这些lua函数注册到哪个命名空间,在lua中,就是代表注册到那个表中,如target_namespace=custom,那么在lua中调用就是以 custom. 开头(但这个参数好像控制不到,真正能控制的是在C++里面是否有custom的命名空间)
这里有两点要注意的
(1)、如果有自定义的命名空间,cocos2dx主目录的tools文件夹下bindings-generator\targets\lua下的conversions.yaml(js的是bindings-generator\targets\spidermonkey下的conversions.yaml)添加自己的命名空间:
ns_map:
"cocos2d::extension::": "cc."
"cocos2d::ui::": "ccui."
"cocos2d::": "cc."
"spine::": "sp."
"cocostudio::": "ccs."
"cocosbuilder::": "cc."
"CocosDenshion::": "cc."
"custom::": "custom."
这个文件貌似是一些替换操作配置(就是在生成C++文件中替换掉所设置的的字符串),自己研究一下就知道了。

(2)如果自己的代码没有命名空间,建议弄一个,不然遇到C++类中的类型

舀鱙A类中有函数参数或返回值用到State类型的,在生成过程中汇报错,报错消息称没有A的命名空间。。。那么这时候就得到第一点提及的地方加入一行:"A::":"A."的信息。在有命名空间的情况下,生成器直接通过。这里是个奇怪的问题。

headers 填入你所编写的代码的头文件

classes 填入要生成的类,支持多个类,支持正则表达式,如classes = A,^A,^A$

skip 指定屏蔽函数,即不需要暴露给lua的函数,支持正则表达式,如 skip = Sprite::[getQuad getBlendFunc ^setPosition$ setBlendFunc]

rename_functions 重新命名暴露到lua中函数名(一般以C++编写函数名暴露到lua),如 rename_functions = SpriteFrameCache::[addSpriteFramesWithFile=addSpriteFrames getSpriteFrameByName=getSpriteFrame],
等号前是原函数名,等号后是lua中的新函数名

rename_classes重命名类,如 rename_classes = SimpleAudioEngine::AudioEngine。前面是原名,后面是lua新名。这个好像没效果,生成后还是那个名字

classes_have_no_parents 指定一些没有父类的类

base_classes_to_skip 指定一些需要跳过的基类

abstract_classes 指定一些抽象类或者没有构造函数的类,以手动方式编写注册到lua函数

编写完后,把只要执行修改过的自定义的或者修改过的genbindings.py(http://www.cocoachina.com/bbs/read.php?tid=196416 提及)就可以生成出相关的代码

3、自动生成的代码会自动过滤掉C++中的protect、private属性、重载父类的函数、带省略号参数的函数(如Menu::create(MenuItem* item, ...) )

七。在我们的项目中添加刚才创建的类和自动生成的类、然后在

AppDelegate.cpp中:

(1)#include "lua_myclass_auto.hpp"  //导入我们自动生成的文件

(2)找到脚本引擎初始化的地方,和其他的语句一样

  lua_myclass_auto.hpp中的方法register_all_**(L)这里是register_all_myclass(L)

编译生成

可以了。

在lua中。使用例子

local testValue = MyTestClass:getTestData()
local testValue2 = MyTestClass2:getTestData()
print('==============='..testValue.."-------------"..testValue2)

遇到问题可能是配置不对,类写的不对等。输出那可以找到

Cocos2dx-lua开发之c++绑定到lua的更多相关文章

  1. Cocos2d-x游戏开发之lua编辑器 Sublime 搭建,集成cocos2dLuaApi和自有类

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/wisdom605768292/article/details/34085969 Sublime Te ...

  2. cocos2dx实例开发之flappybird(入门版)

    cocos2dx社区里有个系列博客完整地复制原版flappybird的全部特性.只是那个代码写得比較复杂,新手学习起来有点捉摸不透,这里我写了个简单的版本号.演演示样例如以下: watermark/2 ...

  3. Cocos2d-x游戏开发之luaproject创建

    操作系统:OS X 10.85 Cocos2d-x 版本号: 2.2.1 使用Cocos2d-x 能够创建luaproject,已经使用cpp创建的project也能够继承lua进行开发,可是lua并 ...

  4. Cocos2d-X游戏开发之Windows7+VS2010环境搭建(亲测)

    Cocos2d—X游戏引擎,提供Mac系统下的Xcode开发和Windows系统的VS开发,应该是比较常用的2种. 使用Mac以后,就会发现使用Xcode开发实在是福分啊.VS开发步骤繁琐,调试效率低 ...

  5. [整理]Unity3D游戏开发之Lua

    原文1:[Unity3D]Unity3D游戏开发之Lua与游戏的不解之缘(上) 各位朋友,大家好,我是秦元培,欢迎大家关注我的博客,我地博客地址是blog.csdn.net/qinyuanpei.如果 ...

  6. [Unity3D]Unity3D游戏开发之Lua与游戏的不解之缘(下)

    ---------------------------------------------------------------------------------------------------- ...

  7. 为cocos2d-x实现安卓输入框。非全屏,无dialog,绑定到lua

    cocos2d-x官方自带的输入框,简直惨不忍睹,在ios还好,在安卓简直了..用过的都知道... 所以为了用户体验,我们自己搞一个吧.输入框这种东西比较特殊,不像按钮.列表框之类的很容易实现,因为涉 ...

  8. 【cocos2d-x + Lua(1) 绑定Lua并使用tolua++】

    为什么要使用Lua进行游戏开发?转载请注明出处http://www.cnblogs.com/zisou/p/cocos2dx-lua1.html 上面一个问题我觉得在我们使用Lua之前需要深入思考的, ...

  9. cocos2dx 关于lua 绑定的环境配置官方文档翻译与 将自己定义c++方法绑定到lua的的方法

    网上有好多写如何讲自己定义的方法绑定到lua的文章,当中都仅仅对环境配置做了简单的介绍,看到有的帖子写在绑定中遇到了各种各样的error.大部分是因为环境配置不对导致的,下面是官方的文档有标准的说明, ...

随机推荐

  1. Fix the “No Private Key” Error Message

    This article will show you how to correct the “No Private Key” error message in Windows Internet Inf ...

  2. jQuery中append()与appendTo()方法区别

    1. append(content)方法 方法作用:向每个匹配的元素内部追加内容. 参数介绍:content (<Content>): 要追加到目标中的内容. 用法示例: HTML代码为& ...

  3. 关于伪类元素:before和:after

    关于伪类元素:before和:after   CSS中存在一些比较特殊的属性,称之为伪类,它们之中最常用的就是定义链接的伪 :link:未被访问状态 :visited:已被访问状态 :hover:鼠标 ...

  4. 学习CSS3BUTTON(二)

    今天,继续学习其源代码: button { margin-left: 0; margin-right: 0; *padding: 5px 5px 3px 5px; } /*margin-left:设定 ...

  5. iOS8中用UIVisualEffectView实现高斯模糊视图(毛玻璃效果)

    UIBlurEffect *beffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleDark]; UIVisualEffectView *vi ...

  6. PG sys function

    The System Catalogs of PostgreSQLscott=# \dS List of relations Schema | Name | Type | Owner -------- ...

  7. Leetcode: Elimination Game

    There is a list of sorted integers from 1 to n. Starting from left to right, remove the first number ...

  8. Applescript 带参数调用某个App的方法

    do shell script "open '/Users/eran/Documents/Workground/DragonAdventure/FlashCode/tools/SWFInfo ...

  9. [转] MongoDB shell 操作 (查询)

    最近有用到mongoDB,每次都去查看官方文档很是费劲,自己准备写点东西.但在博客园上看到另外的一篇博文不错,就转载过来,加上点儿自己的修饰 左边是mongodb查询语句,右边是sql语句.对照着用, ...

  10. bzoj4547 小奇的集合

    当序列中最大和次大都是负数的时候,其相加会是一个更小的负数,因此答案为(Σai)+(m1+m2)*k,如果最大是正数次大是负数,那么一直相加直到两个数都为正数,当最大和次大都是正数时,做一下矩阵乘法即 ...