Cocos2dx引擎6-分辨率适配

在cocos2dx 2.0之后,Cocos2dx为不同分辨率手机提供了适配的方法,就是使用setDesignResolutionSize,一般情况下在AppDelegate.cpp文件中使用,如下:

auto director = Director::getInstance();
auto glview = director->getOpenGLView();
if(!glview) {
glview = GLView::create("MyGame");
   director->setOpenGLView(glview);
}
glview->setDesignResolutionSize(320,480, kResolutionShowAll);

本文是基于Cocos2dx-3.2版本讲述,其他版本会有细微差别,在

setDesignResolutionSize方法中有五种适配方式:

EXACT_FIT

不进行缩放处理,保持设计尺寸,若手机分辨率和设计尺寸不匹配会出现黑边

NO_BORDER,

没有黑边的缩放方案,这样设计若宽高比不一样会出现图像被裁减问题

SHOW_ALL,

使用宽高较小因子放大,图像不会变形,但有可能出现黑边

FIXED_HEIGHT,

使用高的比例因子放大,但宽的设计尺寸有可能别更改

FIXED_WIDTH,

使用宽的比例因子放大,但高的设计尺寸有可能别更改

 

代码分析:

voidGLViewProtocol::setDesignResolutionSize(float width, float height,ResolutionPolicy resolutionPolicy)
{   
    if (width == 0.0f || height == 0.0f) {
        return;
    }
    _designResolutionSize.setSize(width,height);//保存设计尺寸
    _resolutionPolicy = resolutionPolicy;//匹配方案
    updateDesignResolutionSize();
 }
 
voidGLViewProtocol::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;//使用Y方向缩放因子
            _designResolutionSize.width =
                  ceilf(_screenSize.width/_scaleX);//重新计算Width
        }
        else if ( _resolutionPolicy ==ResolutionPolicy::FIXED_WIDTH) {
            _scaleY = _scaleX; //使用X方向缩放因子
            _designResolutionSize.height = ceilf(_screenSize.height/_scaleY);//重新计算Height
        }
        float viewPortW =_designResolutionSize.width * _scaleX;
        float viewPortH =_designResolutionSize.height * _scaleY;
        //计算视口大小&位置
       _viewPortRect.setRect((_screenSize.width - viewPortW) / 2,(_screenSize.height - viewPortH) / 2,viewPortW, viewPortH);
        auto director =Director::getInstance();
        director->_winSizeInPoints =getDesignResolutionSize();
        director->createStatsLabel();//游戏调试显示信息
        director->setGLDefaultValues();//设置OpenGL视口,设置2D 3D相关属性
 
    }
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值