Cocos2dx-- Lua與C++繫結
C++與Lua互動原理
首先,不同語言互動,我們一般把這種程式設計方式稱為混合程式設計。開發中為什麼要多語言混合使用,只用c++不行嗎?答案是因為指令碼語言語法糖多使用方便、沙盒式安全機制使系統更穩定、簡單易學降低開發成本等,那麼,只用指令碼不行嗎?那也是不合理的,因為與系統api的介面、計算密集性模組的效能要求等是指令碼語言不擅長的,這一部份仍然需要c/c++來完成。因此,為了綜合各自的優勢,就出現了混合程式設計的需要。
那麼,在一個程式的生命週期裡,具體哪些部份c++寫,哪些部份是指令碼寫?它們的互動介面又在哪裡?一般與系統緊密相關的,如程式啟動、建立視窗及渲染器、事件迴圈分發,各種視窗訊息、網路事件的接收分發等一般c++來做。而具體邏輯相關的,如訊息和事件的處理器(事件驅動),會根據傳入的引數及當前狀態做出反應,包括改變指令碼自身環境內的變數,呼叫繫結的c函式從而修改c/c++端的變數等一般指令碼來做。
然後,它們又是在哪裡互動的,怎麼互動的?簡單點講就是維護了一個堆疊,需要互動的資料通過入棧,出棧操作來傳遞資料。而具體指令碼語言的實現機制,一般來說都會有一個編譯模組、一個虛擬機器(執行)模組、一套型別實現及資料管理模組,通常還會有一個供外部操作的介面,如lua c api,這個介面讓嵌入方得以操作指令碼狀態(如訪問變數、呼叫函式、管理記憶體),實現互動。
最後,總結一下,所有程式最終都是以機器碼的形式被硬體CPU執行,從這個角度去看,不同語言的程式碼並沒有本質區別,最終都是被編譯器編譯從二進位制機器碼,而所謂互動,就是在處理共享資料而已。
tolua工具的使用
cocos2dx c++與lua 繫結具體流程:使用的cocos版本是3.4,Mac環境,但Windows上和cocos的其它版本流程也是一樣。
修改cocos本身的類介面繫結到Lua
具體步驟:
1,找到cocos自帶的繫結工具指令碼檔案genbindings.py,在cocos工程的frameworks/cocos2d-x/tools/tolua這個目錄下,把這個檔案開啟。2,在開啟的genbindings.py檔案下面找到這麼一段程式碼:
這裡就是執行這個指令碼會自動生成lua繫結程式碼的所有物件和這些物件所在的目錄與繫結程式碼生成的目的路徑,#是註釋,通過它指定只生成修改過的模組的繫結程式碼。3,執行genbindings.py,開啟命令列工具,cd到這個目錄,再在當前目錄執行這個指令碼。(1,cd + tolua目錄路徑 2,./genbindings.py)
4,xcode重新編譯下c++程式碼,繫結成功。
自定義類繫結到Lua
1,寫好自定義類,我們一般把這個類放在Classes目錄,我自己專案的目錄如下:
2,寫好這個類的.ini配置檔案,copy其它的.ini配置,只需要改下類名空間,路徑等,多個類寫一個配置裡資訊用空格隔開。具體示意圖如下:
我的配置檔案:
配置檔案主要修改地方:
3,執行genbindings.py指令碼,就會在指定目錄自動生成自定義類繫結到lua的程式碼。
4,最後是把生成的繫結程式碼註冊到lua環境棧,如圖所示:
cocos AppDelegate.cpp裡的這個程式碼完成的建立lua環境棧和註冊:
注意事項
1,自己新增的自定義類,打包到andriod上時,需要修改安卓的打包配置,把新增的檔案新增進去(不光針對這裡,所有打安卓包,新增的東西都是要加入到這個配置中才會拷貝)。示意圖如下:
2,mac終端中執行genbindings.py這個指令碼,如果報“ImportError: No module named yaml”這個錯誤,解決方式是:在終端中逐個輸入:以下3句命令,mac會自動幫我們下載安裝這3個東東,安裝完畢就可以了。
在終端分別逐行輸入以下內容:
sudo easy_install pip
sudo pip install PyYAML
sudo pip install Cheetah3,上面是我自己遇到過的問題,如果還出現什麼配置環境的錯誤,如ndk,sdk,ant,python等,對應自己百度吧,網上一堆…