windows cocos2d-x 集成luasocket模塊


今天下午花了點時間在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 module
2 
3 MIME_API int luaopen_mime_core(lua_State *L); //mime module
4 
5 int udp_open(lua_State *L); //udp module
6 
7 int select_open(lua_State *L); //select module
8 
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 #endif
11     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開發出的游戲會有怎樣的效果. 努力吧.

 

累了.

 

 

 

 

 

 

+


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM