真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Lua(8)——Cocos之_Lua調(diào)用C++類-創(chuàng)新互聯(lián)

【嘮叨】

目前累計(jì)服務(wù)客戶上千,積累了豐富的產(chǎn)品開發(fā)及服務(wù)經(jīng)驗(yàn)。以網(wǎng)站設(shè)計(jì)水平和技術(shù)實(shí)力,樹立企業(yè)形象,為客戶提供成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、網(wǎng)站策劃、網(wǎng)頁設(shè)計(jì)、網(wǎng)絡(luò)營銷、VI設(shè)計(jì)、網(wǎng)站改版、漏洞修補(bǔ)等服務(wù)。成都創(chuàng)新互聯(lián)公司始終以務(wù)實(shí)、誠信為根本,不斷創(chuàng)新和提高建站品質(zhì),通過對領(lǐng)先技術(shù)的掌握、對創(chuàng)意設(shè)計(jì)的研究、對客戶形象的視覺傳遞、對應(yīng)用系統(tǒng)的結(jié)合,為客戶提供更好的一站式互聯(lián)網(wǎng)解決方案,攜手廣大客戶,共同發(fā)展進(jìn)步。

    本節(jié)要講的是如果將自己寫的C++類注冊進(jìn)Lua環(huán)境,讓Lua去調(diào)用自定義的C++類。

    網(wǎng)上有很多都是用原始的tolua++工具來注冊C++類的,我看了很多這樣的教程,感覺操作起來十分麻煩,而且也很難看懂他們到底在講什么。

  其實(shí),在cocos2dx v3.2版本中,提供了bindings-generator腳本來封裝toLua++的用法,從而節(jié)省了工作量。

【致謝】

    http://segmentfault.com/blog/hongliang/1190000000718145 (講得非常好?。?/p>

    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 ,解壓并配置環(huán)境變量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下可能在執(zhí)行腳本時有這個錯誤。

        解壓到一某個目錄下面, 并設(shè)置PATH環(huán)境變量的值指向bin目錄下。

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

  【MAC】參見:http://blog.csdn.net/guo_hongjun1611/article/details/39852873


【綁定方法】

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

    并使用Cocos Code IDE創(chuàng)建的Lua項(xiàng)目,綁定方法。

1、將自定義的C++代碼放在 frameworks\runtime-src\Classes 下

    當(dāng)然放哪里是隨意的,我喜歡放在Classes下。

Lua(8) ——Cocos之_Lua調(diào)用C++類

2、添加自定義類的.ini文件

    在 frameworks\cocos2d-x\tools\tolua 中,復(fù)制一份該文件夾下cocos2dx.ini的配置信息,然后修改一些參數(shù),改成我們自定義類的參數(shù)。

Lua(8) ——Cocos之_Lua調(diào)用C++類

    以下列出需要修改的參數(shù)配置:

[custom_api]

# prefix會被添加到生成的函數(shù).你也可以選擇不添加這個到你的模板
prefix = custom_api

# 所有的類都會嵌入到這個命名空間
target_namespace = my

# 類所在的路徑,如果有多個,用空格隔開
headers = %(cocosdir)s/../runtime-src/Classes/PanZoomLayer.h

# 需要注冊的類,如果有多個,用空格隔開
classes = PanZoomLayer

# 不提供給Lua的public成員函數(shù)
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 添加進(jìn)去,并注釋掉其他.ini(這些已經(jīng)不需要重新生成)

Lua(8) ——Cocos之_Lua調(diào)用C++類

4、運(yùn)行 genbindings.py 腳本

    在終端運(yùn)行 genbindings.py 腳本。

    在這里,我是直接寫了一個批處理文件 .bat 。

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

            生成失敗的,基本都是因?yàn)楣ぞ邲]有配置好。

Lua(8) ——Cocos之_Lua調(diào)用C++類

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

Lua(8) ——Cocos之_Lua調(diào)用C++類

    其中 lua_custom_api_auto.hpp 中的 register_all_custom_api 就是我們用來將PanZoomLayer類注冊到Lua環(huán)境中的關(guān)鍵函數(shù)。

Lua(8) ——Cocos之_Lua調(diào)用C++類

    以及在 frameworks\cocos2d-x\cocos\scripting\lua-bindings\auto\api 中也能夠找到我們提供給Lua調(diào)用的接口文件。

Lua(8) ——Cocos之_Lua調(diào)用C++類

5、編譯注冊到Lua

    注冊自定義類的函數(shù)在我們的 lua_custom_api_auto.hpp 中可以看到。

        register_all_custom_api(lua_State* tolua_S)

Lua(8) ——Cocos之_Lua調(diào)用C++類

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

  (1)將自定義的類 PanZoomLayer 添加到項(xiàng)目工程的Classes下。

Lua(8) ——Cocos之_Lua調(diào)用C++類

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

Lua(8) ——Cocos之_Lua調(diào)用C++類

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

        將 $(EngineRoot)../runtime-src/Classes 路徑加進(jìn)去。

Lua(8) ——Cocos之_Lua調(diào)用C++類

  (4)編輯 frameworks\runtime-src\Classes 下的入口類 AppDelegate.cpp

        > 添加:lua_custom_api_auto.hpp 頭文件

Lua(8) ——Cocos之_Lua調(diào)用C++類

        > 注冊:register_all_custom_api(state)

        > 注意:register_all_custom_api 的上下兩句話,必須加上!

Lua(8) ——Cocos之_Lua調(diào)用C++類

    (5)編譯運(yùn)行整個項(xiàng)目,完成C++類的注冊到Lua。

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


【開啟智能提示】

    雖然我們將我們自定義的C++類注冊到了Lua中調(diào)用,但是在Cocos Code IDE中卻沒有我們自定義類的智能提示。

    我們需要修改一些配置,讓Cocos Code IDE加上對我們自定義類的智能提示。

1、Cocos2dx引擎中的智能提示

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

    隨便找個 cc.Label 把!

    我們按住鍵盤的 ctrl 鍵,然后點(diǎn)擊 ccLabel,就會跳轉(zhuǎn)到聲明它們的地方。

Lua(8) ——Cocos之_Lua調(diào)用C++類

  文件跳轉(zhuǎn)到了如下兩幅圖的地方:

Lua(8) ——Cocos之_Lua調(diào)用C++類

Lua(8) ——Cocos之_Lua調(diào)用C++類

    可能看到以上兩幅圖,你就明白應(yīng)該怎么給我們自定義的C++類加上智能提示了吧?

    我們先找到以下文件路徑:(可能每個人的不一樣)

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

  可以發(fā)現(xiàn)該路徑下有一個 api.zip 這個壓縮包。

    我們將其 api.zip 解壓出來看看里面都是什么東西。Lua(8) ——Cocos之_Lua調(diào)用C++類

Lua(8) ——Cocos之_Lua調(diào)用C++類

Lua(8) ——Cocos之_Lua調(diào)用C++類

    可以發(fā)現(xiàn)里面全是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

Lua(8) ——Cocos之_Lua調(diào)用C++類

    PanZoomLayer.lua 代碼如下:

Lua(8) ——Cocos之_Lua調(diào)用C++類

    然后我們將 my.lua 和 PanZoomLayer.lua 一并壓縮到 myapi.zip 中。

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

Lua(8) ——Cocos之_Lua調(diào)用C++類

    然后我們打開Cocos Code IDE的工程項(xiàng)目,配置屬性。

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

    將我們的 myapi.zip 壓縮包添加進(jìn)去,點(diǎn)擊“確定”。

Lua(8) ——Cocos之_Lua調(diào)用C++類

    這樣,就可以在 Cocos Code IDE 中愉快的玩我們自定義的類了。

    有智能提示,就是爽啊?。?!Lua(8) ——Cocos之_Lua調(diào)用C++類

Lua(8) ——Cocos之_Lua調(diào)用C++類

Lua(8) ——Cocos之_Lua調(diào)用C++類

Lua(8) ——Cocos之_Lua調(diào)用C++類

3、添加智能提示(方式二)

    通過上面的方式一的方法雖然可以有智能提示,可是后來我發(fā)現(xiàn)定義的命名空間 my 卻無法識別。這樣的結(jié)果將導(dǎo)致創(chuàng)建的 my.PanZoomLayer:create() 賦值給 self 的成員 self.pzLayer 后,繼續(xù)使用 self.pzLayer 時,對應(yīng)的函數(shù)又無法提示了。

Lua(8) ——Cocos之_Lua調(diào)用C++類

    所以這里我們通過修改官方智能提示包 api.zip ,來達(dá)到更加的智能提示的效果。

    操作方法和方式一類似,我們先將官方的提示包 api.zip 解壓出來,最好將其備份一份。

    文件在:

    \Cocos Code IDE\configuration\org.eclipse.osgi\bundles\61\1\.cp\resource\cocos2dx-3.2

Lua(8) ——Cocos之_Lua調(diào)用C++類

    然后我們將我們自定義提示包 my.luaPanZoomLayer.lua 放入 api 文件夾中。

Lua(8) ——Cocos之_Lua調(diào)用C++類

    然后在 api 文件夾中找到 global.lua 這個全局聲明文件。

    將我們自定義的命名空間 my 聲明進(jìn)去。

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

Lua(8) ——Cocos之_Lua調(diào)用C++類

    保存關(guān)閉,將 api 文件夾壓縮成 api.zip 包。

Lua(8) ——Cocos之_Lua調(diào)用C++類

    然后刷新我們的項(xiàng)目工程,然后再來試試我們自定義類的智能提示效果。

    可以發(fā)現(xiàn),自定義的類的智能提示已經(jīng)和 官方的智能提示功能 完全一致了。

    又可以愉快的玩耍啦!??!Lua(8) ——Cocos之_Lua調(diào)用C++類

Lua(8) ——Cocos之_Lua調(diào)用C++類


【遇到的問題】

1、腳本生成出錯

Lua(8) ——Cocos之_Lua調(diào)用C++類

Lua(8) ——Cocos之_Lua調(diào)用C++類

    這些出錯都是由于沒有配置 pyyaml、Cheetah、dos2unix 引起的,都下過來配置一下即可。

2、編譯到Android手機(jī)出錯

    上面的配置完成后IOS的部分是可以正常運(yùn)行的,但是這個時候編譯android時不通過的。

    因?yàn)?AppDelegate.cpp 里面調(diào)用的 register_all_MyClass(L) 方法在android不存在,android的項(xiàng)目里并沒有配置去編譯對應(yīng)的 PanZoomLayer.cpp 文件和后續(xù)生成的 lua_custom_api_auto.cpp。

    所以需要在android端配置Android.mk文件,讓項(xiàng)目編譯時去編譯這兩個C++文件才行。

    (1)首先配置JNI下面的Android.mk文件,讓JNI部分編譯時去編譯PanZoomLayer.cpp:

        編輯 frameworks/runtime-src/proj.android/jni/Android.mk

        在 LOCAL_SRC_FILES 參數(shù)的后面添加:(注意后面的 \ ,僅最后一行不加斜杠)

            ../../Classes/PanZoomLayer.cpp

Lua(8) ——Cocos之_Lua調(diào)用C++類

        在 LOCAL_C_INCLUDES 參數(shù)的后面添加:(注意后面的 \ ,僅最后一行不加斜杠)

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

Lua(8) ——Cocos之_Lua調(diào)用C++類

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

        在 LOCAL_SRC_FILES 參數(shù)的后面添加:(注意后面的 \ ,僅最后一行不加斜杠)

            auto/lua_custom_api_auto.cpp

Lua(8) ——Cocos之_Lua調(diào)用C++類

        在 LOCAL_C_INCLUDES 參數(shù)的后面添加:(注意后面的 \ ,僅最后一行不加斜杠)

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

Lua(8) ——Cocos之_Lua調(diào)用C++類

    (3)然后 Build-Runtime,將項(xiàng)目在Android端編譯一下。

Lua(8) ——Cocos之_Lua調(diào)用C++類

    (4)若編譯成功,就可以在Android手機(jī)上測試了!


另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。


新聞名稱:Lua(8)——Cocos之_Lua調(diào)用C++類-創(chuàng)新互聯(lián)
文章鏈接:http://weahome.cn/article/djiepd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部