lua 封裝成C++風格的類__C++

來源:互聯網
上載者:User

轉寄,請保持地址:http://blog.csdn.net/stalendp/article/details/8920018

在cocos2dx中使用lua進行開發的過程中,肯定會涉及到對lua功能進行擴充的情況,網路上已經有相關的文章,不過不是那麼簡單明了。所以我這裡特意寫了這篇文章,也是作為自己學習的一個總結吧。這裡我將使用Eclipse來開發lua。使用eclipse開發lua,可以運用其強大的擴充能力,大大地加快開發。文章將介紹怎麼定製一個工具來產生lua,並進行調用。 開發工具下載

使eclipse開發lua有兩種方法: 1)安裝ldt; 2)下載整合好的eclipse;

ldt的安裝就不介紹了,大家可以到網上去搜尋關於eclipse外掛程式安裝的教程;官方也有相應的說明:http://www.eclipse.org/koneki/ldt/#documentation

如果要安裝c++相關的功能,還需要安裝cdt,cdt的官方如下:http://www.eclipse.org/cdt/downloads.php


工程的建立 建立一個工程,叫luaTester; 然後編輯main.lua,運行,結果如下:

調試介面:

配置toLua++工具 在cocos2dx中開發lua,需要用到toLua++來組建檔案。網上已經有相關教程,不過都不是很全面,操作也不是很方便。我在這裡利用eclipse強大的工具配置功能來定製toLua++,使得開發更有效率。
點擊菜單Run->External Tools -> External Tools Configurations...;彈出對話方塊,如下圖所示:

在Program下增加一個工具,就叫luaMaker吧;配置如上圖。 幾點說明(假設cocos2dx的根目錄為/Users/shhqw132/Documents/cocos2d-2.1rc0-x-2.1.3): 1) 在tools/tolua++目錄下有tolua++工具,預設是打包的(windows打包成rar檔案;mac下打包成zip檔案)。根據情況減壓一個到tools/tolua++下;上圖中,工具的Location定位到剛剛減壓縮出來的可執行檔。 2)Eclipse中內建了一些變數的地址。這裡用到了${resource_loc} 這個變數,即當前選擇的資源在系統中的絕對路徑。 3)toLua++命令格式如下: ./toLua++ -L basic.lua -o xxx.cpp xxx.pkg  ; -L:指定相應lua檔案的位置(用於修改產生的cpp檔案,cocos2dx中用來對tolua++生產的檔案做fix); -o 指定的是產生的cpp檔案的名稱; xxx.pkg是規則檔案。 toLua++的作用就是讀取xxx.pkg檔案,然後結合-L中指定的lua(用於修改產生的程式碼),最終產生cpp檔案。 在上圖的Arguments中,添加相應的tolua++的參數。
更多關於-L的說明。 由於toLua++不支援回呼函數,而cocos2dx中用到了如registerScriptHandler等回呼函數,所以cocos2dx對用toLua++產生的程式碼進行了一些fix;這些fix的規則在tools/tolua++/basic.lua中定義。所以為了支援回呼函數,請使用這個檔案。
OK,工具配置完畢。
整合開發 建立一個cocos2d_lua工程,命名為LuaTest01。在項目的classes檔案夾下建立一個pkg子檔案夾,然後引入到工程中(我是用引用的方式加進來的)。 然後建立一個MyTest.h,並形成一個MyTest.pkg檔案;具體如下圖:
MyTest.h

#ifndef LuaTest01_MyTest_h#define LuaTest01_MyTest_h#include "cocos2d.h"USING_NS_CC;class MyTest: public CCLayer {private:    int invokeHandler;public:    MyTest() : invokeHandler(0) {}        CREATE_FUNC(MyTest);        void setHandler(int _handler)   {        this->invokeHandler = _handler;    }        void callFunc() {        CCLuaStack* pStack = CCLuaEngine::defaultEngine()->getLuaStack();        pStack->pushInt(123);        pStack->executeFunctionByHandler(this->invokeHandler, 1);    }        void sayHello() {        CCLog("Hello, world!");    }        static void classInfo() {        CCLog("This class is MyTest");    }        void otherFunc() {        //This function doesn't expose to the lua    }};#endif
把MyTest.cpp中要暴露的方法,整合到MyTest.pkg中,如下:
class MyTest: public CCLayer {      static MyTest* create();        void setHandler(LUA_FUNCTION _handler) ;        void callFunc() ;        void sayHello() ;        static void classInfo() ;};
注意點:1)由於pkg中不識別宏,所以要把CREATE_FUNC ( MyTest );展開成 static MyTest* create();   2)回呼函數雖然是指標類型(也就是一個int), 但是在pkg中要聲明成LUA_FUNCTION這一自訂類型。然後在cocos2dx的一個擴充中(可以在basic.lua檔案中找到)對其進行處理。
在eclipse中建立lua工程,並引用xcode中的pkg檔案夾。如下圖:



最終效果如下:
右擊選擇TextEditor,可以開啟MyTest.pkg進行編輯。

保持MyTest.pkg為選擇狀態,然後點擊工具列上的luaMaker。將在pkg檔案夾下產生MyTest.pkg.cpp檔案。 在xcode中把MyTest.pkg.cpp檔案拖到工程中,如下圖:
在MyTest.pkg.cpp中加入標頭檔:
#include "MyTest.h"

拷貝MyTest.pkg.cpp中的tolua_MyTest_open函數的聲明到MyTest.h中。
/* Exported function */TOLUA_API int  tolua_MyTest_open (lua_State* tolua_S);
並在MyTest.h中引入下面的標頭檔:
extern "C" {#include "tolua++.h"#include "tolua_fix.h"}#include "CCLuaEngine.h"

在遊戲啟動代碼中註冊自訂的c++函數,使這些函數能夠在lua中被使用。 在AppDelegate.cpp 中引用標頭檔MyTest.h;並在appicationDidFinishLaunching方法中加入如下代碼:
tolua_MyTest_open(pEngine->getLuaStack()->getLuaState());
編譯一下。OK,完成之後,我們編寫的c++端的代碼,通過tolua_MyTest_open被註冊到了lua環境下了。接下來的事情就是編寫lua端代碼了。 切換到Eclipse下,和上面的方法一樣,在Eclipse中引入xcode項目中的Resources目錄,如下圖:
雙擊開啟hello.lua,  在main函數中加入如下代碼:
cclog("====test static method=====");MyTest:classInfo();cclog("====test member function========");local mt = MyTest:create();mt:sayHello();cclog("====test callback function=====");local function callback(num)cclog("This is the function from lua, and param is: " .. num);endmt:setHandler(callback);mt:callFunc();
結果如下:

準備工作做好之後,接下來在MyTest檔案中添加函數的工作就很簡單了。 1)在eclipse中修改pkg檔案,選中其檔案,執行luaMaker命令; 2)在xcode中開啟MyTest.pkg.cpp, 加入MyTest.h標頭檔,編譯; 3)在eclipse中,編輯lua檔案,使用新加入的函數。 OK,enjoy yourself。
如果遇到編碼問題,請右擊檔案-》properties;在彈出的對話方塊中選擇編碼,如下圖:


參考文章: http://blog.linguofeng.com/archive/2013/03/19/cocos2d-x-lua-callback-function.html
http://blog.csdn.net/xiaominghimi/article/details/8770396
http://www.cocos2d-x.org/boards/11/topics/4222



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.