cocos2d-x 3.x(回头巩固基础知识之分辨率的适配(下))

1.updateDesignResolutionSize()函数

void GLView::updateDesignResolutionSize()
{
    if (_screenSize.width > 0 && _screenSize.height > 0
        && _designResolutionSize.width > 0 && _designResolutionSize.height > 0)
    {
        _scaleX = (float)_screenSize.width / _designResolutionSize.width;
        _scaleY = (float)_screenSize.height / _designResolutionSize.height;

        if (_resolutionPolicy == ResolutionPolicy::NO_BORDER)
        {
            _scaleX = _scaleY = MAX(_scaleX, _scaleY);
        }

        else if (_resolutionPolicy == ResolutionPolicy::SHOW_ALL)
        {
            _scaleX = _scaleY = MIN(_scaleX, _scaleY);
        }

        else if ( _resolutionPolicy == ResolutionPolicy::FIXED_HEIGHT) {
            _scaleX = _scaleY;
            _designResolutionSize.width = ceilf(_screenSize.width/_scaleX);
        }

        else if ( _resolutionPolicy == ResolutionPolicy::FIXED_WIDTH) {
            _scaleY = _scaleX;
            _designResolutionSize.height = ceilf(_screenSize.height/_scaleY);
        }

        // calculate the rect of viewport
        float viewPortW = _designResolutionSize.width * _scaleX;
        float viewPortH = _designResolutionSize.height * _scaleY;

        _viewPortRect.setRect((_screenSize.width - viewPortW) / 2, (_screenSize.height - viewPortH) / 2, viewPortW, viewPortH);

        // reset director's member variables to fit visible rect
        auto director = Director::getInstance();
        director->_winSizeInPoints = getDesignResolutionSize();
        director->createStatsLabel();
        //对视口(OpenGL渲染窗口大小)重新定义
        director->setGLDefaultValues();
    }
}

2.屏幕适配的函数setDesignResolutionSize()

通过1中的代码可以看出:

//1.自适应:不管宽和高的缩放比例是否相同,只是缩放到铺满整个窗口(视口的大小)
//  优点:铺满整个屏幕窗口
//  缺点:图像拉伸明显
    glview->setDesignResolutionSize(1280, 720, ResolutionPolicy::EXACT_FIT);
//2.无黑边:以宽高的缩放比例中,较大的为准进行缩放(视口的大小)
//  优点:铺满屏幕窗口
//  缺点:缩放比小的一边有可能会超出屏幕窗口(相当于投影仪的影像超出了影布的范围),导致图像在屏幕中显示不全。
    glview->setDesignResolutionSize(1280, 720, ResolutionPolicy::NO_BORDER);
//3.完全显示:以宽高的缩放比例中,较小的为准进行缩放(视口的大小)
//  优点:图像在屏幕中显示完全
//  缺点:缩放比大的一边有可能会出现黑边
    glview->setDesignResolutionSize(1280, 720, ResolutionPolicy::SHOW_ALL);
//4.以高的缩放比例为准,进行缩放(视口的大小)
//  优点:高方向的图像在屏幕中显示完全
//  缺点:宽方向的图像在屏幕中显示不完全(有可能超出屏幕)
    glview->setDesignResolutionSize(1280, 720, ResolutionPolicy::FIXED_HEIGHT);
//5.以宽的缩放比例为准,进行缩放(视口的大小)
//  优点:宽方向的图像在屏幕中显示完全
//  缺点:高方向的图像在屏幕中显示不完全(有可能超出屏幕)
    glview->setDesignResolutionSize(1280, 720, ResolutionPolicy::FIXED_WIDTH);

3.容易弄混的函数getWinSize(),getVisibleSize(),getVisibleOrigin(),getFrameSize()

getWinSize()函数就是_designResolutionSize的大小,只要_designResolutionSize的大小没有重置,getWinSize()的值就不会变。
getVisibleSize()函数:

Size GLView::getVisibleSize() const
{
    if (_resolutionPolicy == ResolutionPolicy::NO_BORDER)
    {
        return Size(_screenSize.width/_scaleX, _screenSize.height/_scaleY);
    }
    else 
    {
        return _designResolutionSize;
    }
}

由上可以看出:只有NO_BORDER适配模式的时候,getVisibleSize()的大小会特殊,其他情况下,getVisibleSize()和getWinSize()可以理解为大小相同。

getVisibleOrigin()函数:

Vec2 GLView::getVisibleOrigin() const
{
    if (_resolutionPolicy == ResolutionPolicy::NO_BORDER)
    {
        return Vec2((_designResolutionSize.width - _screenSize.width/_scaleX)/2, 
                           (_designResolutionSize.height - _screenSize.height/_scaleY)/2);
    }
    else 
    {
        return Vec2::ZERO;
    }
}

同样,只有在NO_BORDER适配模式的时候,getVisibleOrigin()函数的大小有变化,其他情况大小都为Vec2::ZERO(也就是Vec2(0.0f, 0.0f))

getFrameSize()函数,获取到的是_sceneSize的大小,即真机中显示屏幕的大小。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值