cocos2dx作茧自缚修改creator_to_cocos2dx(一)

前言

  反正是作死,新项目选择了cocos2dx+lua,ui编辑器用的是cocoscreator,还是义无反顾的使用。然后现在回想起来,真心是一路坑。但是,在使用的时候,触控的大神已经能支持导出绝大部分的功能了。我也只能在他们的基础上小打小闹下。
  先讲个尴尬的事情,刚开始用creator的时候,一个程序给我说他打开creator文件要10多分钟,然后我愣是没发现问题,没办法的情况下,我把工程文件发给了触控的大神。结果,他给我说,一张图片70多m,我才发现美术出图的问题。贼尴尬。
  动刀开始吧,仅供参考,本人比较菜,若不喜,请轻轻的喷我。

第一刀

  creator每次导出的时候(这里是用这里写图片描述),会发现把reader目录下面的所有.cpp和.h文件都拷贝到自己的工程,有时候vs有点蛋疼会重新编译一次,所以我把拷贝的地方干掉了,直接在工程中提交了reader的文件。
  方法:在BuildWorker.js文件中的Fs.copySync(Constants.READER_PATH, codeFilesDist);这句话注释掉就可以了。当然这是个人爱好。
cocos2dx作茧自缚修改creator_to_cocos2dx(一)_第1张图片
  这样每次导出的时候就不会导出reader文件了。

第二刀

  EditBox的问题,我用的版本editbox在creator中必须加上背景图片,如果不加入背景图片那么就会变成默认的白色背景,这个有点悲剧(我不知道后面修改没有)
  在EditBox.js中,修改如下图的地方:
这里写图片描述
  然后在CreatorReader.cpp中cocos2d::ui::EditBox* CreatorReader::createEditBox(const buffers::EditBox* editBoxBuffer) const这个函数做如下修改:
cocos2dx作茧自缚修改creator_to_cocos2dx(一)_第2张图片
  然后就可以在creator中添加EditBox不需要加入背景图片了。

第三刀

  万恶的fnt路径问题,(貌似新的修改了,这里依然用的自己的),BitmapFont在导出的时候路径会出问题,在windows上没毛病,但是在ios中就出大问题了。找不到路径,后来看了下导出的中间文件json,才发现是“\”和 “/”的问题。
  Utils.js 中,let get_font_path_by_uuid = function(uuid) 这里做如下修改
cocos2dx作茧自缚修改creator_to_cocos2dx(一)_第3张图片
   然后倒出来的路径就会是/,从而在ios上面就不会出错了。

第四刀

  因为用creator作为UI编辑器,所以,很多UI都不是场景,而creator在lua中调用getSceneGraph函数,返回的是一个Scene。这并不满足我们这个项目的需求,那么就添加了一个getNodeGraph函数。
  修改如下:
1. CreatorReader.h 中添加如下函数:

cocos2d::Node* getNodeGraph() const;  
cocos2d::Node* createTreeRTNode(const buffers::NodeTree* treeBuffer) const;

修改函数定义:

void setupSpriteFrames(); //改为public函数
cocos2d::Node* createTree(const buffers::NodeTree* treeBuffer ,cocos2d::Node* node = nullptr) const;

2.CreatorReader.cpp

//cocos2d::Node* getNodeGraph() const;  
cocos2d::Node* CreatorReader::getNodeGraph() const
{
    const void* buffer = _data.getBytes();

    auto sceneGraph = GetSceneGraph(buffer);
    auto nodeTree = sceneGraph->root();
    CCLOG("NodeTree: %p", nodeTree);
    cocos2d::Node* tempnode = cocos2d::Node::create();
    createTree(nodeTree, tempnode);
    _animationManager->playOnLoad();
    tempnode->addChild(_collisionManager);
    tempnode->addChild(_animationManager);
     _collisionManager->start();

    return static_cast(tempnode);
}

//修改
cocos2d::Node* CreatorReader::createTree(const buffers::NodeTree* tree, cocos2d::Node* node /*= nullptr*/) const
{
    //cocos2d::Node *node = nullptr;

    const void* buffer = tree->object();
    buffers::AnyNode bufferType = tree->object_type();
    bool parsing_button = false;
    if (node == nullptr)
    {
        switch (static_cast<int>(bufferType))
        {
        case buffers::AnyNode_NONE:
            break;
        case buffers::AnyNode_Node:
            node = createNode(static_cast<const buffers::Node*>(buffer));
            break;
        case buffers::AnyNode_Label:
            node = createLabel(static_cast<const buffers::Label*>(buffer));
            break;
        case buffers::AnyNode_RichText:
            node = createRichText(static_cast<const buffers::RichText*>(buffer));
            break;
        case buffers::AnyNode_Sprite:
            node = createSprite(static_cast<const buffers::Sprite*>(buffer));
            break;
        case buffers::AnyNode_TileMap:
            node = createTileMap(static_cast<const buffers::TileMap*>(buffer));
            break;
        case buffers::AnyNode_Particle:
            node = createParticle(static_cast<const buffers::Particle*>(buffer));
            break;
        case buffers::AnyNode_Scene:
            node = createScene(static_cast<const buffers::Scene*>(buffer));
            break;
        case buffers::AnyNode_ScrollView:
            node = createScrollView(static_cast<const buffers::ScrollView*>(buffer));
            break;
        case buffers::AnyNode_ProgressBar:
            node = createProgressBar(static_cast<const buffers::ProgressBar*>(buffer));
            break;
        case buffers::AnyNode_Button:
            node = createButton(static_cast<const buffers::Button*>(buffer));
            parsing_button = true;
            break;
        case buffers::AnyNode_EditBox:
            node = createEditBox(static_cast<const buffers::EditBox*>(buffer));
            break;
        case buffers::AnyNode_CreatorScene:
            break;
        case buffers::AnyNode_SpineSkeleton:
            node = createSpineSkeleton(static_cast<const buffers::SpineSkeleton*>(buffer));
            break;
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
        case buffers::AnyNode_VideoPlayer:
            node = createVideoPlayer(static_cast<const buffers::VideoPlayer*>(buffer));
            break;
        case buffers::AnyNode_WebView:
            node = createWebView(static_cast<const buffers::WebView*>(buffer));
            break;
#endif
        case buffers::AnyNode_Slider:
            node = createSlider(static_cast<const buffers::Slider*>(buffer));
            break;
        case buffers::AnyNode_Toggle:
            node = createToggle(static_cast<const buffers::Toggle*>(buffer));
            break;
        case buffers::AnyNode_ToggleGroup:
            node = createToggleGroup(static_cast<const buffers::ToggleGroup*>(buffer));
            break;
        case buffers::AnyNode_PageView:
            node = createPageView(static_cast<const buffers::PageView*>(buffer));
            break;
        case buffers::AnyNode_Mask:
            node = createMask(static_cast<const buffers::Mask*>(buffer));
            break;
        case buffers::AnyNode_DragonBones:
            node = createArmatureDisplay(static_cast<const buffers::DragonBones*>(buffer));
            break;
        }
    }
    // recursively add its children
    const auto& children = tree->children();
    for(const auto& childBuffer: *children)
    {
        cocos2d::Node* child = createTree(childBuffer);
        if (child && node)
        {
            // should adjust child's position except Button's label
            if (parsing_button && dynamic_cast(child) != nullptr)
            {
                auto button = static_cast(node);
                auto label = static_cast(child);
                button->setTitleLabel(label);
            }
            else
            {
                node->addChild(child);
                adjustPosition(child);
            }
        }
    }

    return node;
}

cocos2d::Node* creator::CreatorReader::createTreeRTNode(const buffers::NodeTree* treeBuffer) const
{
    return createTree(treeBuffer->children()->Get(0));
}

这样在creator可以将node或者layout作为父节点,而不需要Canvas画布了
在lua中可以这样调用:

     local _bound_missed = cc.CreatorReader:createWithFilename("xxxx.ccreator")
     _bound_missed:setupSpriteFrames()
    self._graph = _bound_missed:getNodeGraph()
    self._graph:addTo(self)

第五刀

  新版本支持了动画导出,动画的贝塞尔曲线中的Easing有个bug,修改Easing.cpp中的cubicIn函数
  以前写的是:

return k * k * 3;

  修改为:

return k * k * k;

  我觉得应该是手误。

未完待续

  由于时间问题,先列举出来以前修改的部分,明天继续
1. 目前项目急需的,并且等不及触控大神更新的一个功能:就是帧动画的导出,也就是clip中的替换SpriteFrame的功能,倒出来应该是Comps。急需的意思就是,其他都没考虑,只考虑了SpriteFrame的功能。明天整理出来。
2. 坐标的问题,这里坐标会坑疯人的。

最后

  当然,这里都是自己作死用一些奇葩的功能。还好的是,都可以修改,要是不能修改就真心真心蛋疼了。当然,特别佩服那些自己造轮子的人,不像我,还只能在别人的轮子上做修改。

你可能感兴趣的:(cocos2dx学习之路,cocos2d-x,lua,creator)