使用cocos studio界面自适应遇到问题及解决方法

时间:2024-03-19 19:12:17

使用cocos studio界面自适应遇到问题及解决方法

如上图用Cocos Studio 3.10 创建的界面,其中两个Hello word 文本框都绑定在 一个 Node节点上,该Node节点限定在左上都20个像素位置。

模拟运行 iphone4 及 iphone5 确实达到了我的效果。

使用cocos studio界面自适应遇到问题及解决方法 使用cocos studio界面自适应遇到问题及解决方法


发布资源到工程中运行后发现在 iphone4 分辨率情况下 Hello Word 消失了。

经过一番盘查发现在界面加载的时候存在一定问题。

1.通过继承的如下方法来解析获得节点

virtual cocos2d::Node* createNodeWithFlatBuffers(const flatbuffers::Table* nodeOptions) 


2.解析过程会借用 LayoutComponent 这个类进行自适应设置


    void LayoutComponent::setPositionPercentX(float percentMargin)

    {

        _positionPercentX = percentMargin;


        if (_usingPositionPercentX || _horizontalEdge == HorizontalEdge::Center)

        {

            Node* parent = this->getOwnerParent();

            if (parent != nullptr)

            {

                _owner->setPositionX(parent->getContentSize().width * _positionPercentX);

                this->refreshHorizontalMargin();

            }

        }

    }


3.但是在运行到获得父节点返回为空,原因是先解析后 addChild。


使用cocos studio界面自适应遇到问题及解决方法


那么只要在 node->addChild(child);

在进行一次设置即可。

加载过程会调用如下代码 

    LayoutComponent* LayoutComponent::bindLayoutComponent(Node* node)

    {

        LayoutComponent * layout = (LayoutComponent*)node->getComponent(__LAYOUT_COMPONENT_NAME);

        if (layout != nullptr)

            return layout;


        layout = new (std::nothrow) LayoutComponent();

        if (layout && layout->init())

        {

            layout->autorelease();

            node->addComponent(layout);

            return layout;

        }

        CC_SAFE_DELETE(layout);

        return nullptr;

    }


Component* Node::getComponent(const std::string& name)

{

    if (_componentContainer)

        return _componentContainer->get(name);

    

    return nullptr;

}


此可见其数据还储存在 _componentContainer

最终如下修改 

使用cocos studio界面自适应遇到问题及解决方法

使用过程中场景文件的根节点都必须设为 sceneroot,然后对其大小进行根据winSize大小一次设定。