Quick-Cocos2dx-Community_3.6.3_Release 中 tolua++ 使用方法

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

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

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

曾经在C++中写了不少类,供Lua调用。如今cocos底层换了之后,编译不经过,因而想经过tolua++从新导出一遍类接口,可是之前导出接口的配置文件不存在了,因而我才要花时间研究tolua++怎么用。android

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

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

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

#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文件。

相关文章
相关标签/搜索