cocos2dx-Quick3.8.1手动集成 (Cocos3.8.1集成Quick工程教程)

原文地址:http://www.cppblog.com/hxt22222/articles/212054.html

    写于2015年10月20日
     一、准备工作
           1.到cocos官网http://www.cocos.com/download/ 下载cocos2dx引擎 (目前为3.8.1).
           2.由于QUICK项目已经停止更新,自行使用github或者到论坛下载cocos2dx-Quick的最后版本(本文章使用的是quick3.5,和官方有不少出入,但是不影响工程的集成)。
     
     二、 Quick源文件的移植
            1.Quick工程项目移植.从Quick工程下移植到同样路径的3.8.1工程下。

                

                

           2.移植LUABINDING的QUICK引擎自身的C++文件。
               
               
                

        3.移植QUICK lua framework中的lua代码。

          
           
         4.Quick工程模板移植。这样才能在 cocos 命令中直接使用 -t quick去生成quick工程。

           
       
           

        5.移植工作完成,生成工程,先在3.8.1的根目录使用python运行setup.py去更新系统的环境变量,然后创建一个Quick工程。
             先把移植过来需要引动模板里的文件增加到cocos2dx_files.json里  这样就不用每一个工程都去add。
                quick自身引擎部分 修改文件
               "external/lua/quick/LuaEventNode.cpp", 

              "external/lua/quick/LuaEventNode.h", 
              "external/lua/quick/LuaNodeManager.cpp", 
              "external/lua/quick/LuaNodeManager.h", 
             "external/lua/quick/LuaTouchEventManager.cpp", 
             "external/lua/quick/LuaTouchEventManager.h", 
             "external/lua/quick/LuaTouchTargetNode.cpp", 
             "external/lua/quick/LuaTouchTargetNode.h", 
             "external/lua/quick/lua_cocos2dx_quick_manual.cpp", 
             "external/lua/quick/lua_cocos2dx_quick_manual.hpp", 

             
              修改cocos/scripting/lua-bindings/cocos2d_lua_bindings.xcodeproj 文件或者手动ADD到此工程中 这样以后由模板生成lua_bindings工程就自然包含了quick的cpp
            在工程的 compile source 里也把 cpp add一下。
                 
             
            开始创建
            cocos new QuickProject3.8 -p com.quick.quick -l lua -d /Users/xiaoting/ --portrait -t quick

            
    
             创建成功.
     
     三、Quick工程的编译和调整.(MAC 环境 10.11 XCODE 7.0.1)
          

        1. 编译中可能会产生字符码转换报错,可以在总工程的link binary with libraries 中add libiconv.2.dylib (Windows环境中没有测试过是否有这个问题 我是遇到了)。

            
            可以通过修改templates下的工程文件配置使以后的项目自动集成此lib
                          
             
             修改方法自行参考其他LIB的方式。简单举例(只贴了部分)
             
        2. 如果遇到bitcode导致的问题需要把bitcode可以关闭。
             
         
      3. <1> 3.8引擎里Sprite有一些变化导致之前QUICK自身的CCFilteredSprite.cpp 报错 红色部分
          void FilteredSprite::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags)

         {

             // Don't do calculate the culling if the transform was not updated

             _insideBounds = (flags & FLAGS_TRANSFORM_DIRTY) ? renderer->checkVisibility(transform, _contentSize) : _insideBounds;

    

           if(_insideBounds)

           {

               // normal effect: order == 0

               _quadCommand.init(_globalZOrder, _texture->getName(), getGLProgramState(), _blendFunc, &_quad, 1, transform);

                 renderer->addCommand(&_quadCommand);

                //        for(auto &command : _pCommand) {

             //            QuadCommand &q = std::get<2>(command);

             //            q.init(_globalZOrder, _texture->getName(), std::get<1>(command)->getGLProgramState(), _blendFunc, &_quad, 1, transform);

             //            renderer->addCommand(&q);

             //        }

 

           }

      }  替换为 

 

         trianglesCommand.init(_globalZOrder, _texture->getName(), getGLProgramState(), _blendFunc, _polyInfo.triangles, transform, flags);

 

         renderer->addCommand(&_trianglesCommand);     
        <2>quicklib下的CCCustomFilter.cpp中rapidJson类方法报错 用MemberBegin 替换 MemberonBegin MemberEnd 替换 MemberonEnd。

     4.链接时 quick  lib register 报错,因为没有把QUICK原文件包含到 libluacocos2d工程的 compile source 里。

        
          此时已经可以在32位的模拟器上运行了,但是由于64位模拟器运行还需要设置一下 总工程的 other linker flag 才行(5S以上的IPHONE机型)LUAJIT的原因:
             
          $(_COCOS_LIB_IOS_BEGIN) $(_COCOS_LIB_IOS_END) -pagezero_size 10000 -image_base 100000000 
            建议直接把参数加到引擎的模板工程里 这样就能一次修改 永久通用了。RELEASE和DEBUG都可以修改
             IPHONEOS_DEPLOYMENT_TARGET = 5.0;

LIBRARY_SEARCH_PATHS = "";
OTHER_LDFLAGS = (
"$(_COCOS_LIB_IOS_BEGIN)",
"$(_COCOS_LIB_IOS_END)",
);
"OTHER_LDFLAGS[sdk=iphonesimulator*][arch=x86_64]" = (
"$(_COCOS_LIB_IOS_BEGIN)",
"$(_COCOS_LIB_IOS_END)",
"-pagezero_size",
10000,
"-image_base",
100000000,
);
     
   四、3.8.1 需要及时处理的BUG
          1. IOS9 3D打光导致模型黑掉的BUG
             cocos引擎 3d文件下 CCMesh.cpp 
            static void resetLightUniformValues()
            {
             const auto& conf = Configuration::getInstance();
             int maxDirLight = conf->getMaxSupportDirLightInShader();
             int maxPointLight = conf->getMaxSupportPointLightInShader();
             int maxSpotLight = conf->getMaxSupportSpotLightInShader();

          s_dirLightUniformColorValues.assign(maxDirLight, Vec3::ZERO);
          s_dirLightUniformDirValues.assign(maxDirLight, Vec3::ZERO);

          s_pointLightUniformColorValues.assign(maxPointLight, Vec3::ZERO);
          s_pointLightUniformPositionValues.assign(maxPointLight, Vec3::ZERO);
          s_pointLightUniformRangeInverseValues.assign(maxPointLight, 0.0f);
          s_spotLightUniformColorValues.assign(maxSpotLight, Vec3::ZERO);
          s_spotLightUniformPositionValues.assign(maxSpotLight, Vec3::ZERO);
          s_spotLightUniformDirValues.assign(maxSpotLight, Vec3::ZERO);
          s_spotLightUniformInnerAngleCosValues.assign(maxSpotLight, 0.0f); 替换-->  s_spotLightUniformInnerAngleCosValues.assign(maxSpotLight, 1.0f); 
          s_spotLightUniformOuterAngleCosValues.assign(maxSpotLight, 0.0f);
          s_spotLightUniformRangeInverseValues.assign(maxSpotLight, 0.0f);
      } 

     2. ClippingRectangeNode裁剪导致布局错乱。
        用以下代码替换 ClippingRectangleNode::onBeforeVisitScissor 方法
      void ClippingRectangleNode::onBeforeVisitScissor()
     {
          if (_clippingEnabled) {
              glEnable(GL_SCISSOR_TEST);
               float scaleX = _scaleX;
              float scaleY = _scaleY;
              Node *parent = this->getParent();
              while (parent) {
                  scaleX *= parent->getScaleX();
                  scaleY *= parent->getScaleY();
                  parent = parent->getParent();
              }

              const Point pos = convertToWorldSpace(Point(_clippingRegion.origin.x, _clippingRegion.origin.y));
              GLView* glView = Director::getInstance()->getOpenGLView();
              glView->setScissorInPoints(pos.x/* * scaleX*/ /*fix by xiaoz*/,
                                         pos.y/* * scaleY*/,
                                         _clippingRegion.size.width * scaleX,
                                         _clippingRegion.size.height * scaleY);
             }
      }

posted on 2016-09-27 10:35  ZhYQ_note  阅读(629)  评论(0编辑  收藏  举报

导航