quick cocos2dx 3.3rc1 如何Lua調用自定義C++類(一)------ 生成橋接代碼

    雖然網上很多關於Lua調用自定義C++類的文章,但不知道爲什麼,一到自己去實踐,總是遇見這樣那樣的問題,造成失敗。讓我都懷疑文章的正確性了。。。有些因爲細節原因,而文章又沒提!踩了無數的坑,昨天終於成功了,今天迫不及待寫篇文章與大家分享!

    如果對lua與C++如何交互不怎麼清楚的朋友,可以看下這篇文章:

    【木頭Cocos2d-x 026】Lua篇(第01章):讓Lua和C++牽手

 

    如果版本不是3.x的,用以前版本的可以看下這篇文章:

    Cocos2d-x下Lua調用自定義C++類和函數的最佳實踐

 

    這篇文章詳細介紹了幾種lua調用C++的方法,最終說明了cocos2dx 3.x 用bindings-generator腳本,是多麼的方便,我也感同身受,因爲之前還用tolua++試過調用,還是以失敗告終。。。j_0012.gif

    雖然上面那篇文章說的很詳細,但是我親身經歷測試成功,還是簡單說下,讓大家看得簡單明瞭!!!

    在這之前還是要說下,除了安裝好Python之外,需要進行2個步驟:

    1.安裝Pyymal

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

    2.下載pyCheetah,並解壓到C:\Python27\Lib\site-packages

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

    還有NDK版本要r9d版本!!!!!!

 

    官方文檔:如何使用 bindings-generator 自動生成 lua綁定

    以官方文檔CustomClass類爲例,步驟如下:

    以下說的frameworks都是項目下的frameworks,不是quick下的!!!!

    1.在frameworks/runtime-src/Classes/目錄下,創建CustomClass類

    frameworks/runtime-src/Classes/CustomClass.h

// CustomClass.h
#ifndef __CUSTOM__CLASS
#define __CUSTOM__CLASS
#include "cocos2d.h"
class CustomClass : public cocos2d::Ref
{
public:
    CustomClass();
    ~CustomClass();
    bool init();
    CREATE_FUNC(CustomClass); 
    int foo(int i);
};
#endif // __CUSTOM__CLASS

    frameworks/runtime-src/Classes/CustomClass.cpp

#include "CustomClass.h"
CustomClass::CustomClass()
{
}
CustomClass::~CustomClass()
{
}
bool CustomClass::init()
{
    return true;
}
int CustomClass::foo(int i)
{
  return i + 100;
}

    2.在frameworks/cocos2d-x/tools/tolua/目錄下,創建cocos2dx_custom.ini文件

[cocos2dx_custom]
prefix = cocos2dx_custom
target_namespace = cc
android_headers = -I%(androidndkdir)s/platforms/android-14/arch-arm/usr/include -I%(androidndkdir)s/sources/cxx-stl/gnu-libstdc++/4.7/libs/armeabi-v7a/include -I%(androidndkdir)s/sources/cxx-stl/gnu-libstdc++/4.7/include -I%(androidndkdir)s/sources/cxx-stl/gnu-libstdc++/4.8/libs/armeabi-v7a/include -I%(androidndkdir)s/sources/cxx-stl/gnu-libstdc++/4.8/include
android_flags = -D_SIZE_T_DEFINED_
clang_headers = -I%(clangllvmdir)s/lib/clang/3.3/include 
clang_flags = -nostdinc -x c++ -std=c++11 -U __SSE__
cocos_headers = -I%(cocosdir)s -I%(cocosdir)s/cocos -I%(cocosdir)s/cocos/platform/android
cocos_flags = -DANDROID
cxxgenerator_headers =
extra_arguments = %(android_headers)s %(clang_headers)s %(cxxgenerator_headers)s %(cocos_headers)s %(android_flags)s %(clang_flags)s %(cocos_flags)s %(extra_flags)s
headers = %(cocosdir)s/../runtime-src/Classes/CustomClass.h
classes = CustomClass
skip =
rename_functions =
rename_classes =
remove_prefix =
classes_have_no_parents =
base_classes_to_skip =
abstract_classes =
script_control_cpp = no

     這是最簡單的ini文件了,看起來很多,其實最主要的是修改以下幾句,其他幾乎不用改變。

[cocos2dx_custom]
prefix = cocos2dx_custom
target_namespace = cc
headers = %(cocosdir)s/../runtime-src/Classes/CustomClass.h
classes = CustomClass

     具體含義看官方文檔吧,這裏就不說了,這裏要說的是[cocos2dx_custom],必須與文件名字一樣,否則運行腳本的時候,會報錯!反正最好和文件名字一樣,就不用再去踩坑了!prefix這個也用文件名字吧~

    3.在frameworks/cocos2d-x/tools/tolua/目錄下,修改腳本

    我把genbindings.py拷貝了一份把名字改成genbindings_custom.py,修改以下代碼:

cmd_args = {'cocos2dx_custom.ini' :('cocos2dx_custom', 'lua_cocos2dx_custom_auto') }

    這樣就只會編譯這個一個文件,節約時間!!!

    4.在frameworks/cocos2d-x/tools/tolua/目錄下,運行腳本

    在frameworks/cocos2d-x/tools/tolua/目錄下運行cmd,然後輸入命令 Python genbindings_custom.py

成功執行genbindings.py腳本後,會在frameworks/cocos2d-x/cocos/scripting/lua-bindings/auto/目錄下,生成以下2個文件

wKiom1SIG33zoC7NAAA38iRWuks071.jpg

    到此我們所需要的文件都齊全了!!!!!!!

    關於如何調用在下篇文章講解!

    如有不足之處,請大家指出,一起交流成長!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章