CC3.2+Lua(8) ——Lua调用自定义C++类

【唠叨】

本节要讲的是如果将自己写的C++类注册进Lua环境,让Lua去调用自定义的C++类

网上有很多都是用原始的tolua++工具来注册C++类的,我看了很多这样的教程,感觉操作起来十分麻烦,而且也很难看懂他们到底在讲什么。

其实,在cocos2dx v3.2版本中,提供了bindings-generator脚本来封装toLua++的用法,从而节省了工作量。

【致谢】

http://segmentfault.com/blog/hongliang/1190000000718145 (讲得非常好!)

http://cn.cocos2d-x.org/article/index?type=code-ide&url=/doc/cocos-docs-master/manual/code-ide/binding-custom-class-to-lua/zh.md (官方文档)

【使用工具】

Windows7 x64

Cocos2dx v3.2

Cocos Code IDE 1.0.1 (支持自定义类的智能提示功能)

python 2.7.x(v3.2版本不一定要2.7.3,我用2.7.8也成功了的)

NDK r9d ,解压并配置环境变量NDK_ROOT(v3.2版本不一定要r9b,我用r9d成功了的)

pyyaml ,安装到 "Python的安装目录\Lib\site-packages"

http://pyyaml.org/download/pyyaml/PyYAML-3.10.win32-py2.7.exe

Cheetah ,并解压到 "Python的安装目录\Lib\site-packages"

https://raw.github.com/dumganhar/my_old_cocos2d-x_backup/download/downloads/Cheetah.zip

dos2unix ,windows下可能在执行脚本时有这个错误。

解压到一某个目录下面, 并设置PATH环境变量的值指向bin目录下。

http://waterlan.home.xs4all.nl/dos2unix/dos2unix-7.1-win32.zip



【绑定方法】

以下介绍的是在 Windows7 + VS2013 + Cocos Code IDE

并使用Cocos Code IDE创建的Lua项目,绑定方法。

1、将自定义的C++代码放在 frameworks\runtime-src\Classes 下

当然放哪里是随意的,我喜欢放在Classes下。

2、添加自定义类的.ini文件

在 frameworks\cocos2d-x\tools\tolua 中,复制一份该文件夹下cocos2dx.ini的配置信息,然后修改一些参数,改成我们自定义类的参数。

以下列出需要修改的参数配置:

[custom_api]

# prefix会被添加到生成的函数.你也可以选择不添加这个到你的模板
prefix = custom_api

# 所有的类都会嵌入到这个命名空间
target_namespace = my

# 类所在的路径,如果有多个,用空格隔开
headers = %(cocosdir)s/../runtime-src/Classes/PanZoomLayer.h

# 需要注册的类,如果有多个,用空格隔开
classes = PanZoomLayer

# 不提供给Lua的public成员函数
skip = PanZoomLayer::[onTouchesBegan onTouchesMoved onTouchesEnded init onEnter onExit update]

# 这些全空就好了
rename_functions =
rename_classes = 
remove_prefix = 
classes_have_no_parents = 
base_classes_to_skip =
abstract_classes = 
script_control_cpp = no

3、genbindings.py 添加自定义的配置.ini

在 frameworks\cocos2d-x\tools\tolua 的 genbindings.py 中的129行找到 cmd_args

将我们自定义的 custom_api.ini 添加进去,并注释掉其他.ini(这些已经不需要重新生成)

4、运行 genbindings.py 脚本

在终端运行 genbindings.py 脚本。

在这里,我是直接写了一个批处理文件 .bat 。

注意:只要需要用到的工具都下载,安装,配置好了,一般就能生成成功。

生成失败的,基本都是因为工具没有配置好。

生成成功后,在 frameworks\cocos2d-x\cocos\scripting\lua-bindings\auto 中会找到我们生成的C++的桥接文件, lua_custom_api_auto.cpplua_custom_api_auto.hpp

其中 lua_custom_api_auto.hpp 中的 register_all_custom_api 就是我们用来将PanZoomLayer类注册到Lua环境中的关键函数。

以及在 frameworks\cocos2d-x\cocos\scripting\lua-bindings\auto\api 中也能够找到我们提供给Lua调用的接口文件。

5、编译注册到Lua

注册自定义类的函数在我们的 lua_custom_api_auto.hpp 中可以看到。

register_all_custom_api(lua_State* tolua_S)

使用 VS2013 打开 frameworks\runtime-src\proj.win32 下的工程。

(1)将自定义的类 PanZoomLayer 添加到项目工程的Classes下。

(2)将 lua_custom_api_auto.cpp、lua_custom_api_auto.hpp 添加到工程liblua的auto下。

(3)添加lualib工程的文件搜索路径。

将 $(EngineRoot)../runtime-src/Classes 路径加进去。

(4)编辑 frameworks\runtime-src\Classes 下的入口类 AppDelegate.cpp

> 添加:lua_custom_api_auto.hpp 头文件

> 注册:register_all_custom_api(state)

> 注意:register_all_custom_api 的上下两句话,必须加上!

(5)编译运行整个项目,完成C++类的注册到Lua。

然后就可以再Lua中愉快的使用自定义的类了!



【开启智能提示】

虽然我们将我们自定义的C++类注册到了Lua中调用,但是在Cocos Code IDE中却没有我们自定义类的智能提示。

我们需要修改一些配置,让Cocos Code IDE加上对我们自定义类的智能提示

1、Cocos2dx引擎中的智能提示

首先我们来看一下Cocos Code IDE中cocos2dx引擎的智能提示是怎么搞的。

随便找个 cc.Label 把!

我们按住键盘的 ctrl 键,然后点击 cc Label,就会跳转到声明它们的地方。

文件跳转到了如下两幅图的地方:

可能看到以上两幅图,你就明白应该怎么给我们自定义的C++类加上智能提示了吧?

我们先找到以下文件路径:(可能每个人的不一样)

\CocosCodeIDE\configuration\org.eclipse.osgi\bundles\61\1\.cp\resource\cocos2dx-3.2

可以发现该路径下有一个 api.zip 这个压缩包。

我们将其 api.zip 解压出来看看里面都是什么东西。

可以发现里面全是cocos2dx的C++类提供给Lua的接口声明。

这些也就是IDE中智能提示的原因。

2、添加自定义类的智能提示

我们仿照 api.zip 中的 cc.lua 和 label.lua 来写一个自定义类的接口声明。

> my.lua           :声明命名空间

> PanZoomLayer.lua :声明自定义类。(这个在使用脚本绑定时,自动生成)

其中 PanZoomLayer.lua 在使用 genbindings.py 脚本时,就自动生成了的。

就在 frameworks\cocos2d-x\cocos\scripting\lua-bindings\auto\api 中。

那么,我们再写一个 my.lua ,也放在这个目录下好了。

其中,my.lua 代码如下:

--------------------------------
-- @module my

--------------------------------------------------------
-- the my PanZoomLayer
-- @field [parent=#my] PanZoomLayer#PanZoomLayer PanZoomLayer preloaded module

return nil

PanZoomLayer.lua 代码如下:

然后我们将 my.lua 和 PanZoomLayer.lua 一并压缩到 myapi.zip 中

就放在 \frameworks\cocos2d-x\cocos\scripting\lua-bindings\auto\api 中好了。

然后我们打开Cocos Code IDE的工程项目,配置属性。

Lua->Build Path->Libraries->Add External Zips

将我们的 myapi.zip 压缩包添加进去,点击“确定”。

这样,就可以在 Cocos Code IDE 中愉快的玩我们自定义的类了。

有智能提示,就是爽啊!!!



【遇到的问题】

1、脚本生成出错

这些出错都是由于没有配置 pyyaml、Cheetah、dos2unix 引起的,都下过来配置一下即可。

2、编译到Android手机出错

上面的配置完成后IOS的部分是可以正常运行的,但是这个时候编译android时不通过的。

因为 AppDelegate.cpp 里面调用的 register_all_MyClass(L) 方法在android不存在,android的项目里并没有配置去编译对应的 PanZoomLayer.cpp 文件和后续生成的 lua_custom_api_auto.cpp。

所以需要在android端配置Android.mk文件,让项目编译时去编译这两个C++文件才行。

(1)首先配置JNI下面的Android.mk文件,让JNI部分编译时去编译PanZoomLayer.cpp:

编辑 frameworks/runtime-src/proj.android/jni/Android.mk

LOCAL_SRC_FILES 参数的后面添加:(注意后面的 \ ,仅最后一行不加斜杠)

../../Classes/PanZoomLayer.cpp

在 LOCAL_C_INCLUDES 参数的后面添加:(注意后面的 \ ,仅最后一行不加斜杠)

$(LOCAL_PATH)/../../Classes

(2)然后配置 frameworks/cocos2d-x/cocos/scripting/lua-bindings/Android.mk文件。

在 LOCAL_SRC_FILES 参数的后面添加:(注意后面的 \ ,仅最后一行不加斜杠)

 auto/lua_custom_api_auto.cpp


在 LOCAL_C_INCLUDES 参数的后面添加:(注意后面的 \ ,仅最后一行不加斜杠)

$(LOCAL_PATH)/../../../../runtime-src/Classes


(3)然后 Build-Runtime,将项目在Android端编译一下。

(4)若编译成功,就可以再Android手机上测试了!



本文出自 “夏天的风” 博客,请务必保留此出处http://shahdza.blog.51cto.com/2410787/1568051

时间: 2024-10-10 02:31:19

CC3.2+Lua(8) ——Lua调用自定义C++类的相关文章

Lua调用自定义C++类

弄了一天终于会Lua调用自定义C++类.不容易啊. 我的电脑是64位的,装了64的Python不行,装了32位的就可以了,靠!下面是报错信息 python pyyaml Cheetah全都是装32位的,其中python版本是用2.7.8,是可以的. Cocos2d-x v3.2 Cocos Code IDE 1.2.0 NDK r9d dos2unix,windows下可能在执行脚本时有这个错误.是创建项目时没有了这个文件,可以去cocos2dx里面复制一个,如 E:\cocos2d-x-3.2

Cocos2d-x下Lua调用自定义C++类和函数的最佳实践 -- 转

原地址: http://blog.segmentfault.com/hongliang/1190000000631630 Cocos2d-x下Lua调用自定义C++类和函数的最佳实践 关于cocos2d-x下Lua调用C++的文档看了不少,但没有一篇真正把这事给讲明白了,我自己也是个初学者,摸索了半天,总结如下: cocos2d-x下Lua调用C++这事之所以看起来这么复杂.网上所有的文档都没讲清楚,是因为存在5个层面的知识点: 1.在纯C环境下,把C函数注册进Lua环境,理解Lua和C之间可以

cocos进阶教程(1)Lua调用自定义C++类和函数的最佳实践

第一层:纯C环境下,把C函数注册进Lua环境 a.lua 文件 print(foo(99)) a.c 文件 #include <lua.h> #include <lualib.h> #include <lauxlib.h> int foo(lua_State *L) { int n = lua_tonumber(L, 1); lua_pushnumber(L, n + 1); return 1; } int main() { lua_State *L = lua_ope

Cocos2d-x下Lua调用自定义C++类和函数的最佳实践

原文地址:http://segmentfault.com/a/1190000000631630 关于cocos2d-x下Lua调用C++的文档看了不少,但没有一篇真正把这事给讲明白了,我自己也是个初学者,摸索了半天,总结如下: cocos2d-x下Lua调用C++这事之所以看起来这么复杂.网上所有的文档都没讲清楚,是因为存在5个层面的知识点: 1.在纯C环境下,把C函数注册进Lua环境,理解Lua和C之间可以互相调用的本质2.在cocos2d-x项目里,把纯C函数注册进Lua环境,理解cocos

【转】Cocos2d-x下Lua调用自定义C++类和函数的最佳实践

转自:http://segmentfault.com/blog/hongliang/1190000000631630 关于cocos2d-x下Lua调用C++的文档看了不少,但没有一篇真正把这事给讲明白了,我自己也是个初学者,摸索了半天,总结如下: cocos2d-x下Lua调用C++这事之所以看起来这么复杂.网上所有的文档都没讲清楚,是因为存在5个层面的知识点: 1.在纯C环境下,把C函数注册进Lua环境,理解Lua和C之间可以互相调用的本质 2.在cocos2d-x项目里,把纯C函数注册进L

lua创建自定义的类

-- 使用lua自定义类 local _class = {} function BaseClass(super) -- 生成一个类类型, 实际上存放类信息 local class_type = {} -- 顶层父类"__delete"为false class_type.__delete = false -- 父类初始化 class_type.super = super -- 创建接口(类似与C++里面的构造函数) class_type.New = function(...) print

CC3.2+Lua(3) ——Lua之class

[唠叨] 在使用Lua的时候,cocos2d-x为我们提供了一个 class(classname, super) 这个函数. 它可以让我们很方便的定义一个类,或者继承cocos2d-x的某个类. PS:class()是cocos2d-x为我们封装的函数,本身Lua没有这个函数. [class] class函数是在"cocos2d-x-3.2/cocos/scripting/lua-bindings/script/extern.lua"中定义的. -- Create an class.

C程序与Lua脚本相互调用

Lua脚本是一种可用于C程序开发/测试的工具,本篇介绍一下C程序与Lua脚本如何进行相互调用,更加详细的操作参见<Programing in Lua>.本文分为3个部分:1.Windows环境下Lua的下载以及安装注意事项:2.Visual C++6.0中Lua的配置:3.C程序与Lua脚本相互调用实例. 1.Windows环境下Lua的下载以及安装注意事项 a.下载Lua for Windows,笔者用的版本是V5.1.4-35: b.上微软官网,下载Visual C++运行库——vcred

C 可变长参数运用-----编写Lua的通用调用函数

1.C可变长参数 printf这个使用频繁的C语言函数的参数列表包含一个const char*的描述串,还有一个可变长参数(...) ,如下为printf的函数声明. int printf(const char * __restrict, ...) 在stdarg.h这个头文件中包含着对可变长参数进行操作的一些宏(x86平台为例): #define va_start(ap,v)( ap = (va_list)&v + _INTSIZEOF(v) ) #define va_arg(ap,t) (