今天下午花了點時間在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開發出的游戲會有怎樣的效果. 努力吧.
累了.
+