Cocos2dx:3.10+cocostudio多屏幕分辨率适配解决方案

1.设计分辨率
配资源使用的分辨率大小,是1334*750。
2.屏幕分辨率
实际上用户屏幕的分辨率大小,不确定。

这里是实现代码:

//
//  FixUIUtils.h
//  MapTest
//
//  Created by Alostz on 16/4/16.
//
//

#ifndef FixUIUtils_h
#define FixUIUtils_h
#include "cocos2d.h"

using namespace cocos2d;
using namespace std;

class FixUIUtils
{
public:
    FixUIUtils();
    
    ~FixUIUtils();
    
    static void init();
    
    static void setFixScale(Node *node);
    
    static void setScaleMin(Node* node);
    
    static void setScaleMax(Node* node);
    
    static void setRootNodewithFIXED(Node* node);
    
    static void fixScene(Node* node);
    
    static void fixUI(Node* node);
    
};

#endif /* FixUIUtils_h */

//
//  FixUIUtils.cpp
//  MapTest
//
//  Created by Alostz on 16/4/16.
//
//

#include 
static cocos2d::Size designSize = cocos2d::Size(750, 1334);
static cocos2d::Size screenSize;
static float minScale;
static float maxScale;

static float xScale;

static float yScale;

FixUIUtils::FixUIUtils(){

}

FixUIUtils::~FixUIUtils(){

}

void FixUIUtils::init(){
    screenSize = Director::getInstance()->getVisibleSize();
    xScale = designSize.width / screenSize.width;
    yScale = designSize.height / screenSize.height;
    minScale = MIN(screenSize.height/designSize.height, screenSize.width/designSize.width);
    maxScale = MAX(screenSize.height/designSize.height, screenSize.width/designSize.width);
    
    log("xScale = %f * xyScale = %f \n screenSize.width = %f * screenSize.height = %f \n",xScale, yScale, screenSize.width, screenSize.height);

}

//1、先适配layout层到屏幕大小
void FixUIUtils::setFixScale(Node *node){
    auto nodeX = node->getScaleX();
    auto nodeY = node->getScaleY();
    log("setFixScale nodeX = %f * nodeX = %f \n",nodeX, nodeY);
    nodeX = nodeX * xScale;
    nodeY = nodeY * yScale;
    
    log("setFixScale nodeX = %f * nodeX = %f \n",nodeX, nodeY);
    node->setScaleX(nodeX);
    node->setScaleY(nodeY);
}

//屏幕宽、高分别和设计分辨率宽、高计算缩放因子,取较(大)者作为宽、高的缩放因子。
//适用于控件的缩放
void FixUIUtils::setScaleMax(Node *node){
    auto nodeX = node->getScaleX();
    auto nodeY = node->getScaleY();
    log("setScaleMax nodeX = %f * nodeX = %f \n",nodeX, nodeY);

    nodeX = nodeX * maxScale;
    nodeY = nodeY * maxScale;
    log("setScaleMax nodeX = %f * nodeX = %f \n",nodeX, nodeY);

    node->setScaleX(nodeX);
    node->setScaleY(nodeY);
}

//屏幕宽、高分别和设计分辨率宽、高计算缩放因子,取较(小)者作为宽、高的缩放因子。
//适用于背景的缩放
void FixUIUtils::setScaleMin(Node *node){
    auto nodeX = node->getScaleX();
    auto nodeY = node->getScaleY();
    log("setScaleMin nodeX = %f * nodeX = %f \n",nodeX, nodeY);

    nodeX = nodeX * minScale;
    nodeY = nodeY * minScale;
    log("setScaleMin nodeX = %f * nodeX = %f \n",nodeX, nodeY);

    node->setScaleX(nodeX);
    node->setScaleY(nodeY);
}


void FixUIUtils::setRootNodewithFIXED(Node* node){
    auto moveX = (designSize.width - screenSize.width);
    auto moveY = (designSize.height - screenSize.height);
    node->setPosition(Point(-moveX ,-moveY));
}

void FixUIUtils::fixScene(Node* node){
    fixUI(node);
    FixUIUtils::setRootNodewithFIXED(node);
}


void FixUIUtils::fixUI(Node* node){
    Vector ChildrenList = node->getChildren();

    for (Node* child: ChildrenList) {
        log("fixUI nodeX = %d \n",child->getTag());
        FixUIUtils::setScaleMin(child);
    }
    
}



调用:

//加载Cocos Studio编辑好的资源
    auto rootNode = CSLoader::createNode("test.csb");
    FixUIUtils::init();
    FixUIUtils::setFixScale(rootNode);
    FixUIUtils::fixScene(rootNode);
    this->addChild(rootNode);





你可能感兴趣的:(cocos2d)