• windows cocos2dx 集成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开发出的游戏会有怎样的效果. 努力吧.

    累了.

    +

  • 相关阅读:
    POJ 1797 Heavy Transportation
    洛谷 P3379 【模板】最近公共祖先(LCA)
    洛谷 P1351 联合权值
    51nod 1272 最大距离
    codevs 1664 清凉冷水
    COGS 1176. [郑州101中学] 月考
    HDU
    HDU
    一坨计算几何的板子
    bzoj2618[Cqoi2006]凸多边形
  • 原文地址:https://www.cnblogs.com/respawn/p/2766867.html
Copyright © 2020-2023  润新知