cocos2d-x屏幕自适应原理

// cocos2d-x源码解析 3.9版本

void GLView::updateDesignResolutionSize()

{

// _screenSize 屏幕分辨率大小

// _designResolutionSize 设计分辨率大小(游戏设计值,以此为准进行的开发,也是在开发中我们正常看到的大小)

// _scaleX,_scaleY  私有变量 其值会直接作用在显示上

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;

// _resolutionPolicy 自适应模式

if (_resolutionPolicy == ResolutionPolicy::NO_BORDER)

{

//  ResolutionPolicy::NO_BORDER --没有黑边的自适应模式,这种情况下会出现某个方向画面超出屏幕外看不到的情况

// 取 _scaleX,_scaleY 中最大的

_scaleX = _scaleY = MAX(_scaleX,_scaleY);

}else if (_resolutionPolicy == ResolutionPolicy::SHOW_ALL) 

{

//  ResolutionPolicy::SHOW_ALL--全部显示的自适应模式,这种情况下某个方向可能会出现黑边 _scaleX最小则Y方向上有黑边,_scaleY最小则x方向上有黑边

// 取 _scaleX,_scaleY 中最小的

_scaleX = _scaleY = MIN(_scaleX,_scaleY);

}else if (_resolutionPolicy ==ResolutionPolicy::FIXED_HEIGHT)

{

//  ResolutionPolicy::FIXED_HEIGHT–以高为标准的自适应模式,这种情况下不考虑横向,完全以高为准 当 _scaleX >_scaleY时 x方向出现黑边,当 _scaleX <_scaleY时x方向超出屏幕

// 以_scaleY为准

_scaleX = _scaleY;

_designResolutionSize.width = ceilf(_screenSize.width/_scaleX);

}else if (_resolutionPolicy == ResolutionPolicy::FIXED_WIDTH)

{

//  ResolutionPolicy::FIXED_WIDTH–以宽为标准的自适应模式,这种情况下不考虑纵向,完全以宽为准 当 _scaleY >_scaleX时 y方向出现黑边,当 _scaleY <_scaleX时y方向超出屏幕

// 以_scaleY为准

_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

// director 字典,又名导演,总管全局

auto director = Director::getInstance();

director->_winSizeInpoints = getDesignResolutionSize();

director->_isStatusLabelUpdated = true;


// Sets the OpenGL default values.

director->setGLDefaultValues();

}

}

黑边可以通过背景大一点的方式优化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值