Cocos2dx-lua开发之c++绑定到lua
一. 简单介绍
文章介绍是在实际的游戏开发项目中,将自定义的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的更多相关文章
- Cocos2d-x游戏开发之lua编辑器 Sublime 搭建,集成cocos2dLuaApi和自有类
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/wisdom605768292/article/details/34085969 Sublime Te ...
- cocos2dx实例开发之flappybird(入门版)
cocos2dx社区里有个系列博客完整地复制原版flappybird的全部特性.只是那个代码写得比較复杂,新手学习起来有点捉摸不透,这里我写了个简单的版本号.演演示样例如以下: watermark/2 ...
- Cocos2d-x游戏开发之luaproject创建
操作系统:OS X 10.85 Cocos2d-x 版本号: 2.2.1 使用Cocos2d-x 能够创建luaproject,已经使用cpp创建的project也能够继承lua进行开发,可是lua并 ...
- Cocos2d-X游戏开发之Windows7+VS2010环境搭建(亲测)
Cocos2d—X游戏引擎,提供Mac系统下的Xcode开发和Windows系统的VS开发,应该是比较常用的2种. 使用Mac以后,就会发现使用Xcode开发实在是福分啊.VS开发步骤繁琐,调试效率低 ...
- [整理]Unity3D游戏开发之Lua
原文1:[Unity3D]Unity3D游戏开发之Lua与游戏的不解之缘(上) 各位朋友,大家好,我是秦元培,欢迎大家关注我的博客,我地博客地址是blog.csdn.net/qinyuanpei.如果 ...
- [Unity3D]Unity3D游戏开发之Lua与游戏的不解之缘(下)
---------------------------------------------------------------------------------------------------- ...
- 为cocos2d-x实现安卓输入框。非全屏,无dialog,绑定到lua
cocos2d-x官方自带的输入框,简直惨不忍睹,在ios还好,在安卓简直了..用过的都知道... 所以为了用户体验,我们自己搞一个吧.输入框这种东西比较特殊,不像按钮.列表框之类的很容易实现,因为涉 ...
- 【cocos2d-x + Lua(1) 绑定Lua并使用tolua++】
为什么要使用Lua进行游戏开发?转载请注明出处http://www.cnblogs.com/zisou/p/cocos2dx-lua1.html 上面一个问题我觉得在我们使用Lua之前需要深入思考的, ...
- cocos2dx 关于lua 绑定的环境配置官方文档翻译与 将自己定义c++方法绑定到lua的的方法
网上有好多写如何讲自己定义的方法绑定到lua的文章,当中都仅仅对环境配置做了简单的介绍,看到有的帖子写在绑定中遇到了各种各样的error.大部分是因为环境配置不对导致的,下面是官方的文档有标准的说明, ...
随机推荐
- Java基础之创建窗口——使用GridBagLayout管理器(TryGridBagLayout)
控制台程序. java.awt.GridBagLayout管理器比前面介绍的其他布局管理器灵活得多,因此使用起来也比较复杂.基本机制就是在随意的矩形网格中布局组件,但网格的行和列不一定拥有相同的高度和 ...
- Android根据baidu Android定位SDK实现定位
参考: http://www.open-open.com/lib/view/open1346982366162.html http://api.map.baidu.com/lbsapi/cloud/g ...
- 隐藏ipad/ip顶部状态栏
在GameViewController.swift中重载prefersStatusBarHidden方法,返回true override func prefersStatusBarHidden() - ...
- getch()函数
这个函数是一个不回显函数,当用户按下某个字符时,函数自动读取,无需按回车,有的C语言命令行程序会用到此函数做游戏,但是这个函数并非标准函数,要注意移植性! 中文名 无 外文名 getch 头文件 co ...
- MySQL 常用函数列表
一.数学函数 select SQRT (2) --取平方根select ABS (-234) --取绝对值select FLOOR (COUNT (*)/5.0) from news --取小于这个小 ...
- adb devices 显示error
1.adb kill-server 2.adb start-server
- paper 29 :CV会议+领先研究室+专家+代码网址
做机器视觉和图像处理方面的研究工作,最重要的两个问题:其一是要把握住国际上最前沿的内容:其二是所作工作要具备很高的实用背景.解决第一个问题的办法就是找出这个方向公认最高成就的几个超级专家(看看他们都在 ...
- Sql Server服务远程过程调用失败解决
Sql Server服务远程过程调用失败解决 问题: 今天SQL数据库登录不上了,然后想启动Sql实例,却发现如下问题(配置环境:win7旗舰版x64,SqlServer2008R2, ...
- oracle的冷备份
oracle冷备份要备份三类文件:数据文件,控制文件,日志文件 查看所有数据文件 select name from v$datafile; 查看所有日志文件 select member from v$ ...
- 夺命雷公狗ThinkPHP项目之----企业网站9之栏目的列表完善(无限极分类的完成)
我们刚才已经写好model了,那么这里直接来调用下他即可: public function lists(){ $mod = D('Category')->catTree(); $this -&g ...