windows cocos2d-x 集成luasocket模块
2012-11-12 19:12 respawn 阅读(10793) 评论(1) 编辑 收藏 举报今天下午花了点时间在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开发出的游戏会有怎样的效果. 努力吧.
累了.
+