参考文章1 http://www.aichengxu.com/view/45851

参考文章2 http://blog.csdn.net/pawleft/article/details/52127443

实际上上面两篇文章已经讲的很清楚,我写此文章的目的,是特别记录自己解决问题的一个历程,而不只是简单的tolua++的使用方法。

曾经在C++中写了很多类,供Lua调用。现在cocos底层换了以后,编译不通过,于是想通过tolua++重新导出一遍类接口,但是以前导出接口的配置文件不存在了,于是我才要花时间研究tolua++怎么用。

上面的两篇文章讲的很清楚。主要以下7步骤:

1 配置好python环境,安装好pyyaml,pyCheetah,这些在Quick-Cocos2dx-Community的根目录下tools\tolua\目录下的README.mdown文件中有详细说明。

2 自己的CCGameClient.cpp和CCGameClient.h写好,可以放在cocos/my/目录下,自定义其它的也可以,在后面的ini文件中指明路径即可。

#ifndef __CCGAME_CLIENT_H
#define __CCGAME_CLIENT_H
#include "cocos2d.h" USING_NS_CC; class CCGameClient : public Object
{
public:
static CCGameClient* shareHandle();
virtual ~CCGameClient();
private:
static CCGameClient* instance_;
CCGameClient();
}; #endif

  

#include "CCGameClient.h"

CCGameClient* CCGameClient::instance_ = NULL;

CCGameClient::CCGameClient()
{} CCGameClient* CCGameClient::shareHandle()
{
if (!instance_)
instance_ = new CCGameClient();
return instance_;
} CCGameClient::~CCGameClient()
{}

  

3 配置.ini文件,这个很重要。tools\tolua\目录下有很多.ini文件,都是cocos自带的一些类的导出配置,可参考。自己可以复制cocos2dx.ini重命名为自己的.ini,比如叫cocos2dx_my_gameclient.ini。主要修改的参数:

[gameclient]
# the prefix to be added to the generated functions. You might or might not use this in your own
# templates
prefix = gameclient # create a target namespace (in javascript, this would create some code like the equiv. to `ns = ns || {}`)
# all classes will be embedded in that namespace
target_namespace = # what headers to parse
headers = %(cocosdir)s/cocos/my/CCGameClient.h classes = CCGameClient skip =
[]里面的名字其实是python在解析这个ini文件的时候读取的元素,这个要记住,一会儿要用的.

target_namespace 说一下,就像你在lua里面要使用某个控件,都以cc.开头一样。
prefix 看说明即可。

headers 就是你自定义的类的头文件的路径,你放在哪里,这个路径就是哪里,不一定放在cocos目录下。这个headers可以是多个。

 classes 在headers中可能会遇到很多class,那么包含在classes中的名字将会被最终导出。

 skip 是要跳过的函数。因为没有必要自定义的类里面的所有方法都暴露给lua,只暴露需要的即可。具体的设置方法可参考其它的init文件,很简单。

4 在genbindings.py中添加刚才配置的cocos2dx_my_gameclient.ini。打开tools\tolua\genbindings.py文件,找到cmd_args的设置,默认是长这样的

tolua_root = '%s/tools/tolua' % project_root
output_dir = '%s/cocos/scripting/lua-bindings/auto' % project_root cmd_args = {'cocos2dx.ini' : ('cocos2d-x', 'lua_cocos2dx_auto'), \
'cocos2dx_assetsmanager.ini' : ('cocos2dx_assetsmanager', 'lua_cocos2dx_assetsmanager_auto'), \
'cocos2dx_extension.ini' : ('cocos2dx_extension', 'lua_cocos2dx_extension_auto'), \
'cocos2dx_ui.ini' : ('cocos2dx_ui', 'lua_cocos2dx_ui_auto'), \
'cocos2dx_studio.ini' : ('cocos2dx_studio', 'lua_cocos2dx_studio_auto'), \
'cocos2dx_spine.ini' : ('cocos2dx_spine', 'lua_cocos2dx_spine_auto'), \
'cocos2dx_physics.ini' : ('cocos2dx_physics', 'lua_cocos2dx_physics_auto'), \
'cocos2dx_experimental_video.ini' : ('cocos2dx_experimental_video', 'lua_cocos2dx_experimental_video_auto'), \
'cocos2dx_experimental.ini' : ('cocos2dx_experimental', 'lua_cocos2dx_experimental_auto'), \
'cocos2dx_controller.ini' : ('cocos2dx_controller', 'lua_cocos2dx_controller_auto'), \
'cocos2dx_cocosbuilder.ini': ('cocos2dx_cocosbuilder', 'lua_cocos2dx_cocosbuilder_auto'), \
'cocos2dx_cocosdenshion.ini': ('cocos2dx_cocosdenshion', 'lua_cocos2dx_cocosdenshion_auto'), \
'cocos2dx_3d.ini': ('cocos2dx_3d', 'lua_cocos2dx_3d_auto'), \
'cocos2dx_audioengine.ini': ('cocos2dx_audioengine', 'lua_cocos2dx_audioengine_auto'), \
'cocos2dx_csloader.ini' : ('cocos2dx_csloader', 'lua_cocos2dx_csloader_auto'), \
}
target = 'lua'
generator_py = '%s/generator.py' % cxx_generator_root

  我们删掉其它的,增加自己的,变成下面。

  标红色部分,就是刚才.ini文件里面[]里面的内容。

 cocos2dx_my_gameclient.ini是配置文件的名字
 lua_gameclient_auto是最终生成的文件的名字。
 tolua_root = '%s/tools/tolua' % project_root
output_dir = '%s/cocos/scripting/lua-bindings/auto' % project_root cmd_args = {'cocos2dx_my_gameclient.ini' : ('gameclient', 'lua_gameclient_auto'), \
}
target = 'lua'
generator_py = '%s/generator.py' % cxx_generator_root

  

5 开始生成,在控制台进入Quick/tools/tolua/ 目录 ,运行genbindings.py。如果步骤1没有装好可能会报错,找不到yaml和Cheetah.Template,去下载相应的库即可。如果成功运行,会在根目录cocos/scripting/lua-bindings/auto 目录下生成lua_gameclient_auto.cpp和lua_gameclient_auto.hpp两个文件,在cocos/scripting/lua-bindings/auto/api 下生成lua_gameclient_auto_api.lua和lua_gameclient_auto_api.lua两个文件。api文件没啥用,是个说明而已。

6 加入到自己的项目。在自己项目中,项目名/frameworks/runtime-src/Classes/下,创建两个文件夹Base和lua-bindings,将CCGameClient.cpp和CCGameClient.h放在Base中,将lua_gameclient_auto.cpp和lua_gameclient_auto.hpp放在lua-bindings中。

7 注册函数。在/frameworks/runtime-src/Classes/lua_module_register.h中增加注册代码register_all_gameclient(),这个方法是在lua_gameclient_auto.hpp中声明的,所以要导入.hpp文件。lua_module_register.h里面的lua_module_register是在applicationDidFinishLaunching()中调用的。

在lua中测试。这是最简单的调用。

local test = CCGameClient:shareHandle()

  

-------------------------我是重点---------------------------

上面哪些步骤其实很简单,都能搜到,真正浪费我时间的是,发现导出的接口中,变量也能导出来,会有类似于下面导出变量的语句。但是,我们刚才写的自定义类,假如加入一个变量,是不会导出的。这让我百度了N久。tolua++能不能导出自定义类的变量?

tolua_variable(tolua_S, "cardSeries", tolua_get_CardRecognization_CardSeries, tolua_set_CardRecognization_CardSeries);
tolua_variable(tolua_S, "cardCount", tolua_get_CardRecognization_CardCount, tolua_set_CardRecognization_CardCount);
tolua_variable(tolua_S, "maxCardPoint", tolua_get_CardRecognization_MaxCardPoint, tolua_set_CardRecognization_MaxCardPoint);
tolua_variable(tolua_S, "attachedCardCount", tolua_get_CardRecognization_AttachedCardCount, tolua_set_CardRecognization_AttachedCardCount);

  后来发现,cocos引擎里面,但凡tolua_variable调用的地方,都不是在auto目录下,而是在manual目录下。

  QQ问了一个老同事,说他们也没有导出过变量,这种导出变量的逻辑本身也不合理。

  quick的QQ群里问大神“tulua工具有没有大神用过 是不是只能导出自己写的类里面的 function 不能导出变量啊 求指导”,后来有个人回复说“本来就不能导出变量啊”

好吧,这我才最终确定,tolu++不能导出变量,以前写的应该都是后来手动加的。如果我这个说法有误,还请大家指导啊。

真机运行前,在android项目的jni目录下的mk文件中加入你的base下面的cpp文件。

Quick-Cocos2dx-Community_3.6.3_Release 中 tolua++ 使用方法的更多相关文章

  1. 分析cocos2d-x的lua项目中的工具方法

    在创建完cocos2d-x的lua项目后.打开项目的Resources中的extern.lua文件.里面有两个用于面向对象的方法.一个是用于克隆,一个是用于继承. 代码分析例如以下 --克隆一个对象 ...

  2. cocos2d-x 2.2.6中c++通过JNI与java互调

    1.HelloCpp.java /**************************************************************************** Copyri ...

  3. quick cocos2d-x 入门---井字棋

    学习quick cocos2d-x 第二天 ,使用quick-x 做了一个井字棋游戏 . 我假设读者已经 http://wiki.quick-x.com/doku.php?id=zh_cn阅读了这个链 ...

  4. quick cocos2dx lua 内存释放

    前言 对于内存的优化,网上有很多例子和教程.总体来说,就那么几种解决方案,在最后我会简单提下,这里先说下在quick中,对于图片的处理. 1.查看内存调试信息 对于quick框架的了解,我们可以参考\ ...

  5. Mac下搭建quick cocos2d-x编译环境

    一. 我知道在你的电脑中一定已经安装好了Xcode(没有自己下载去吧),打开Xcode,开启"偏好设置"对话框(commond + ,).假设打开之后出现的是这种一个对话框,那么直 ...

  6. Quick Cocos2dx Http通讯

    服务端:Python 通讯协议:Http 参考文章: 1 用python实现一个基本的http server服务器 http://blog.sina.com.cn/s/blog_416e3063010 ...

  7. 用Quick Cocos2dx做一个连连看(一)

    呵呵,不知道能不能坚持下来,先写着吧. 预备知识:Quick Cocos2dx 2.2.5基本知识 或者 Cocos2dx基本知识, lua入门 开发工具:Sublime Text 2.0/3.0 原 ...

  8. quick cocos2dx 3.x 配置win32工程

    公司项目主体部分用c++,而ui部分用lua写,所以选择了用quick框架.项目先开发了ios/mac版,这两天试着配置其win32工程,遇到一些问题,记录一下(纯c++版本cocos2dx配置方法应 ...

  9. cocos2d-x_lua中tolua++绑定c++分享

    cocos2d-x_lua中tolua++绑定c++分享    我用的版本号是cocos2d-x 2.x的版本号   下面操作为了保证不更改引擎的一个类LuaCocos2d.cpp  1.操作前 能够 ...

随机推荐

  1. Java之comparable接口

    comparable 接口: 1. 问题:java.util.Collections 类中的方法 Collections.sort(List list) 是根据什么确定容器中对象的“大小”顺序的? 2 ...

  2. 解决ueditor编辑器图片在线管理图片无法显示

    使用ueditor,点击在线管理,服务器图片路径显示不正确,如下图所示  查看源码,如下:  发现图片src中中间多了一长串的项目跟路径,解决的办法是 把  jsp/controller.jsp 里面 ...

  3. Qt——树结点的搜索

    一.Qt中的树 平时我们经常使用树的结构来组织和展示数据,比如文件系统等—— 在Qt中,我们可以使用Qt提供的便捷的QTreeWidget类,利用该类的接口,轻松地将已有数据显示在树中. 除此之外,还 ...

  4. Python单例模式的四种方法

    在这之前,先了解super()和__new__()方法 super()方法: 返回一个父类或兄弟类类型的代理对象,让你能够调用一些从继承过来的方法. 它有两个典型作用: a. 在单继承的类层次结构中, ...

  5. 用select (多路复用)模拟一个 socket server

    需求:用select (多路复用)模拟一个 socket server.可以接收多并发. 1. 一开始是检测自己,如果我有活动了,就说明有客户端要连我了. #用select去模拟socket,实现单线 ...

  6. CentOS yum安装软件包

    yum(Yellowdog Update Modifie)命令是在Fedora和RedHat以及SUSE中基于rpm的软件包管理器,它可以使系统管理人员交互和自动化地更细与管理RPM软件包,能够从指定 ...

  7. [HNOI2004]树的计数 prufer数列

    题面: 一个有n个结点的树,设它的结点分别为v1, v2, …, vn,已知第i个结点vi的度数为di,问满足这样的条件的不同的树有多少棵.给定n,d1, d2, …, dn,你的程序需要输出满足d( ...

  8. 51NOD 2026:Gcd and Lcm——题解

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=2026 参考及推导:https://www.cnblogs.com/ivo ...

  9. 直通BAT面试算法精讲课2

    对于一个int数组,请编写一个冒泡排序算法,对数组元素排序. 给定一个int数组A及数组的大小n,请返回排序后的数组. 测试样例: [1,2,3,5,2,3],6 [1,2,2,3,3,5] clas ...

  10. push与createElement性能比较

    下面的实验是验证push()函数与CreateElement()函数在创建HTML元素的效率.可以看出,实用push()确实效率要比后者要高,不过究竟可以高出多少,还需要有专研精神的朋友去测试了,这里 ...