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

相關文章
相關標籤/搜索