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

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

写于2015年10月20日
 一、准备工作
       1.到cocos官网http://www.cocos.com/download/%C2%A0下载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工程。
注意:安卓工程3.8的jni目录下的 main.cpp的 安卓 入口 cocos_android_app_init()参数修改了 不改掉会导致安卓的.so 库加载失败
改为:void cocos_android_app_init (JNIEnv* env) { LOGD(“cocos_android_app_init”);
AppDelegate *pAppDelegate = new AppDelegate();
}

   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” = (
(_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);
}
}

如果遇到安卓环境下无法进行http请求的情况,是因为少了之前集成QUICK的cocos引擎下的一个JAVA文件,cocos/platform/android/java/src/org/cocos2dx/lib/QuickHTTPInterface.java.
附件已包含

支持~!感谢楼主

mark…

楼主能否共享下弄好的版本:14:

顶顶顶顶顶,

什么是活力,这就是!

顶啊。。。牛逼!!
看这边同样的帖子 有win32 和 andriod 的补充
http://www.cocoachina.com/bbs/read.php?tid=328266&page=1&toread=1#1413669

:2: 顶,v5雄壮