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)找到脚本引擎初始化的地方,和其他的语句一样

  register_all_**(L)  就是之前咱们**就是之前的名字。这里是register_all_myclass(L)

编译生成

可以了。

在lua中。使用例子

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

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

时间: 2024-10-11 00:59:45

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

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

Sublime Text http://baike.baidu.com/view/10701920.htm?from_id=8130415&type=syn&fromtitle=Sublime&fr=aladdin 简介 Sublime Text 是一个代码编辑器(Sublime Text 2是收费软件,但可以无限期试用),也是HTML和散文先进的文本编辑器.Sublime Text是由程序员Jon Skinner于2008年1月份所开发出来,它最初被设计为一个具有丰富扩展功能的V

Cocos2d-x游戏开发之lua工程创建

操作系统:OS X 10.85 Cocos2d-x 版本: 2.2.1 使用Cocos2d-x 可以创建lua工程,已经使用cpp创建的工程也可以继承lua进行开发,但是lua并不支持mac工程(因为一些框架的问题). 支持的工程文件如下: 所有使用创建工程create.py language 为cpp的工程,后集成lua及其工具的时候,要注意这一点. 撒 现在进入cocos2d-x 目录之下,通过cd 进入文件目录 进入之后,如果忘记了命令,可以直接运行 create_project.py 如

Cocos2d-x游戏开发之Lua学习笔记

下载链接 什么是Cocos2d-x 一个开源的移动2D游戏框架,MIT许可证下发布. 可以利用C++.Lua及Javascript来进行部署. 跨平台:iOS,Android,Blackberry,Tizen等. 使用Cocos开发的应用 版权声明:本文原创,转载请注明出处:http://blog.csdn.net/zhoumushui

VC和LUA混合开发之VC程序调用Lua脚本函数

http://www.cnblogs.com/clever101/archive/2010/04/14/1712207.html 作者:朱金灿 来源:http://www.cnblogs.com/clever101/ Lua语言以其卓越的可扩展性.简单.高效率和与平台无关性在游戏领域得到广泛应用.今天花了一些时间学习VC和Lua如何混合开发,编写了一个小例程,和大家分享一下这方面的经验. 首先在http://www.lua.org/ftp/下载Lua的最新版本:lua-5.1.4.然后用VS C

Cocos2d-x游戏开发之luaproject创建

操作系统:OS X 10.85 Cocos2d-x 版本号: 2.2.1 使用Cocos2d-x 能够创建luaproject,已经使用cpp创建的project也能够继承lua进行开发,可是lua并不支持macproject(由于一些框架的问题). 支持的project文件例如以下: 全部使用创建projectcreate.py language 为cpp的project,后集成lua及其工具的时候,要注意这一点. 撒 如今进入cocos2d-x 文件夹之下,通过cd 进入文件文件夹 进入之后

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

cocos2dx社区里有个系列博客完整地复制原版flappybird的所有特性,不过那个代码写得比较复杂,新手学习起来有点捉摸不透,这里我写了个简单的版本.演示如下: 创建项目 VS2013+cocos2dx 3.2创建win32项目,由于只是学习,所以没有编译为安卓.ios或者WP平台的可执行文件. 最终的项目工程结构如下: 很简单,只有三个类,预加载类,游戏主场景类,应用代理类,新手刚入门喜欢将很多东西都写在尽量少的类里面. 游戏设计 游戏结构如下,游戏包含预加载场景和主场景,主场景中包含背

cocos2dx实例开发之2048(添加动画版)

网上找了好多教程写2048,不过都没有实现卡片的移动动画,自己写了一个不太完美的带动画版. 开发步骤: 1,设计一个CardSprite类. 2,设计主游戏场景GameScene,实现游戏逻辑,添加动画逻辑. 3,添加游戏胜利或者游戏失败的层. 4,添加声音等其他元素,专门弄了一个声音预加载的场景. 贴上主场景关键代码: GameScene.h #pragma once #include "cocos2d.h" #include "cardSprite.h" #in

Cocos2d-x Lua游戏开发之Lua oo 的实现

一些面向对象的语言中提供了类的概念,作为创建对象的模版.在这些 语言里面.对象是类的实例,lua通过table也可以实现类的使用. --建立父类Animal Animal = { size,--动物大小 成员变量声明,不赋值为nil age,--动物年龄 color = "yellow",--动物颜色 sex,--动物性别,这个可以有?? new = function ( self,object ) object = object or {}--判断object是否为空,nil就会创建

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

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 喜欢我的博客请记住我的名字:秦元培,我的博客地址是blog.csdn.net/qinyuanpei. 转载请注明出处,本文作者: