代码改变世界

windows cocos2d-x 集成luasocket模块

2012-11-12 19:12  respawn  阅读(10785)  评论(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开发出的游戏会有怎样的效果. 努力吧.

 

累了.

 

 

 

 

 

 

+