[原创]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.
附件已包含

再顶~~~~~~~~~~~
同时补充下。。。我win32 和 andriod 平台吧

我的quick-x 是 wland 版本的quick-x(https://github.com/wland/quick3.6) 是在廖大 的quick-ng基础上弄,而廖大的quick-ng 则是 quick-3.6基础上的

win32:
打开win32 , 你需要 添加 librecast 和libbullet 两个现有项 ,但这样编译 好后,我们直接运行生成的 exe,是不会用到 项目当中 的 src 脚本目录的。
解决方法有:
第一种 :运行exe时,添加 命令 -workdir xxxxxxxxxx xxxxxxxxxxxxxx就是你的工作目录

另一种方法 则是 在 SimulatorWin.cpp的 run() 方法中
_project.parseCommandLine(args);

if (_project.getProjectDir().empty())
{
    if (args.size() == 2)
    {
        // for Code IDE before RC2
        _project.setProjectDir(args.at(1));
        _project.setDebuggerType(kCCRuntimeDebuggerCodeIDE);
    }
}

if (_project.getProjectDir().empty())
{
std::string appPath = getCurAppPath();
appPath.append("/…/…/");
_project.setProjectDir(appPath);
}

// create the application instance
_app = new AppDelegate();

在 if (_project.getProjectDir().empty()) 结尾后面添加一个
if (_project.getProjectDir().empty())
{
std::string appPath = getCurAppPath();
appPath.append("/…/…/");
_project.setProjectDir(appPath);
}

andriod 平台:
需要 把 cocos 模板 中的andriod 的 main.cpp 替换掉 quick的 同文件
目录为\templates\lua-template-default\frameworks\runtime-src\proj.android\jni\hellolua\main.cpp

结合上面,就可以很愉悦的在andriod 和win32 下工作了

推荐结合babelua 在vs 上面开发,代码提示和断点调试爽歪歪
附赠 模板 cocos2dx_files.json文件

感谢楼主!正有此意!

这么麻烦啊?3.8.1的包里面没有官方集成quick吗?

quick后边怎么不更新了呢:3:

楼主你好,非常感谢你分享这么好的文章,我按照你说的流程,弄完可以在xcode运行了,只是lua我都在mac用Sublime Text编译的,我用3.8.1生成新的模拟器后运行一直报错framework/cocos2d/NodeEx.lua 278行出错,请问你知道怎么改吗?

3.8.1 不是集成了quick么?

那是你QUICK LUA 那边的代码需要修改一下 你可以区QUICK 的GITHUB 拉一下 然后比对

顶楼主,好文,很有收获

cocos2dx-Quick3.8.1版本有吗?我之前下的是3.3的现在要下载新版本的都找不到了

好文章

文章内容少于 10 个字节

感谢分享,楼主V5!

请教楼主,我照着你的指导,win和安卓都成功了。
ios编译到最后报了一堆curl的错
能否指点一下?

确认一下 是不是 由于 文章里 三、 1. 编译中可能会产生字符码转换报错,可以在总工程的link binary with libraries 中add libiconv.2.dylib (Windows环境中没有测试过是否有这个问题 我是遇到了)。 这个造成的 原文有图

问题已经解决了。
3.8.1没有问题。
3.9有这个问题,后来发现是因为3.9移除了curl的依赖,导致quick的CCHttpRequest不能用了。
移除掉quick里的http相关的内容,就可以了。

那 QUICK的CCHttpRequest移除后HTTP有什么问题?

HTTP用系统自带的XmlHttpRequest,改动工作量很小的。

OK 没问题就行