windows cocos2d-x 整合luasocket模組

來源:互聯網
上載者:User

今天下午花了點時間在VS2010上面做了cocos2d-x整合luasocket,只是簡單整合了luasocket的模組,

還沒有做像樣的測試,有點累了,我的同學在打遊戲,吵得睡不著,算了,還是先寫部落格,然後回宿舍睡覺吧.

 

cocos2d-x在以前的版本中是支援luasocket的,但是後來的版本中就消失了.我也到論壇去看過,cocos2d-x

的維護人員表示是為了保持開發包的乾淨所以才剔除了cocos2d-x,同樣,以前的版本中也是支援lua-llthread

的,但是現在也沒有了,不過這些都沒有什麼,需要用到的時候我們可以自己動手整合.

 

在自己動手整合luasocket模組的時候我先粗略的瀏覽了一下luasocket的源碼,這也為我後面的整合提供了方法.

在luasocket.h中提供了這樣一個功能函數:

1 LUASOCKET_API int luaopen_socket_core(lua_State *L) // socket module

當然,還有其他的module:

1 int tcp_open(lua_State *L); // tcp module2 3 MIME_API int luaopen_mime_core(lua_State *L); //mime module4 5 int udp_open(lua_State *L); //udp module6 7 int select_open(lua_State *L); //select module8 9 int inet_open(lua_State *L); //inet mode

思路就是來自這裡,luasocket的源碼中已經將註冊的任務都封裝好了,所以接下來的任務主要是在cocos2d-x的源碼中

找到註冊的入口,lua與c/c++的相互調用就不需要我解釋了,大家都知道的.所以,這裡就直接帶過了.

 

cocos2d-x中對於lua引擎做了封裝管理,源碼都在scrpiting/lua/cocos2dx_support檔案夾下面.

 class CCLuaEngine : public CCScriptEngineProtocol  {  public:      static CCLuaEngine* defaultEngine(void);    // 建立引擎方法      static CCLuaEngine* create(void);                    virtual ~CCLuaEngine(void); .... // 中間的方法就省略了.  private:     CCLuaEngine(void)     : m_state(NULL)     {     }          bool init(void);     bool pushFunction(int nHandler);          lua_State* m_state;     static CCLuaEngine* m_defaultEngine; // 靜態私人變數  };

 

 1 CCLuaEngine* CCLuaEngine::m_defaultEngine = NULL; 2  3 // 單例,cocos2d-x源碼中大量運用單例. 4 CCLuaEngine* CCLuaEngine::defaultEngine(void) 5 { 6     if (!m_defaultEngine) 7     { 8         m_defaultEngine = CCLuaEngine::create(); 9     }10     return m_defaultEngine;11 }12 13 CCLuaEngine* CCLuaEngine::create(void)14 {15     CCLuaEngine* pEngine = new CCLuaEngine();16     pEngine->init(); //調用初始化註冊17     return pEngine;18 }19 20 CCLuaEngine::~CCLuaEngine(void)21 {22     lua_close(m_state);23     if (this == m_defaultEngine)24     {25         m_defaultEngine = NULL;26     }27 }

所以需要做的就是在init方法裡面調用前面我說到的luasocket模組提供的註冊方法就可以了.

 1 bool CCLuaEngine::init(void) 2 { 3     m_state = lua_open(); 4     luaL_openlibs(m_state); 5     tolua_Cocos2d_open(m_state); 6     toluafix_open(m_state); 7     luaopen_socket_core(m_state); // 這裡是我加的測試. 8 #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) 9     addLuaLoader(loader_Android);10 #endif11     return true;12 }

另外有一點需要提醒的是,在添加標頭檔的時候需要在extern "C"中添加:

1 extern "C" {2 #include "lualib.h"3 #include "lauxlib.h"4 #include "tolua_fix.h"5 #include "luasocket.h" // 測試用的標頭檔6 }

然後只要將其餘的源檔案複製到項目中

其他的不需要多說了,只要將源碼中的lua模組檔案拷貝到debug目錄下面.就拿HelloLua執行個體來說吧,下面就可以簡單的在hello.lua中嘗試使用luasocket

中的模組.

 

這裡就提供了整合其他部分的方法,我的想法是自己獨立寫封裝,將luasocket裡面所有的子模組全部都封裝起來,省的這樣子弄的源碼亂糟糟的.這個下次再說.

 

另外,我刪除了源碼中的使用BSD風格的源碼,因為在VS中編譯總是通不過.按道理,跨平台編譯,採用宏控制,我不知道為什麼會出錯,這也是我第一次使用VS

那麼長時間,還不熟悉這笨重的傢伙.所以索性就直接幹掉那些檔案吧.

 

然後就是連結winsock庫的問題,在wsocket.h檔案頭添加:

1 #include <winsock.h>2 3 #pragma comment(lib, "Wsock32.lib") // 注意順序,請不要顛倒,這是常識.

在工程屬性裡面配置需要連結庫的路徑,也就是system32路徑下面,這個如果不知道也可以搜得到.

 

說完了,最近考慮自己整合封裝一下luasocket,然後再找一下lua比較好的線程模組.再整合一下.

不知道做完這些之後完全使用lua開發出的遊戲會有怎樣的效果. 努力吧.

 

累了.

 

 

 

 

 

 

+

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.