cocos2dX游戏屏幕适配学习

目前市场上有很多种屏幕

•  2.8英寸分辨率为640x480(VGA)  像素密度286PPI  
•   3.2英寸分辨率为480x320(HVGA)  像素密度167PPI
•   3.3英寸分辨率为854x480(WVGA)  像素密度297PPI  
•   3.5英寸分辨率为480x320(HVGA)  像素密度165PPI  
•   3.5英寸分辨率为800x480(WVGA)  像素密度267PPI  
•   3.5英寸分辨率为854x480(WVGA)  像素密度280PPI  
•  3.5英寸分辨率为960x640(DVGA)  像素密度326PPI(苹果iphone4
•   3.7英寸分辨率为800x480(WVGA)  像素密度252PPI
•   3.7英寸分辨率为960x540(qHD)  像素密度298PPI  
•   4.0英寸分辨率为800x480(WVGA)  像素密度233PPI  
•   4.0英寸分辨率为854x480(WVGA)  像素密度245PPI  
•   4.0英寸分辨率为960x540(qHD)  像素密度275PPI  
•   4.0英寸分辨率为1136x640(HD)  像素密度330PPI(苹果iphone5
•   4.2英寸分辨率为960x540(qHD)  像素密度262PPI    
•   4.3英寸分辨率为800x480(WVGA)  像素密度217PPI  
•   4.3英寸分辨率为960x640(qHD)  像素密度268PPI  
•   4.3英寸分辨率为960x540(qHD)  像素密度256PPI  
•   4.3英寸分辨率为1280x720(HD)  像素密度342PPI
•   4.5英寸分辨率为960*540(qHD)  像素密度245PPI
•   4.5英寸分辨率为1280x720(HD)  像素密度326PPI
•   4.5英寸分辨率为1920x1080(FHD)像素密度490PPI  
•   4.7英寸分辨率为1280x720(HD)  像素密度312PPI  
•   4.8英寸分辨率为1280x720(HD)  像素密度306PPI
•   5.0英寸分辨率为480x800(WVGA)  像素密度186PPI
   5.0英寸分辨率为1024x768(XGA)  像素密度256PPI
•   5.0英寸分辨率为1280*720      像素密度294PPI
•   5.0英寸分辨率为1920x1080(FHD)像素密度441PPI  
•   5.3英寸分辨率为1280x800(WXGA)像素密度285PPI  
•   5.3英寸分辨率为960x540(qHD)  像素密度207PPI
•   6.0英寸分辨率为854×480      像素密度163PPI
•   6.0英寸分辨率为1280X 720     像素密度245PPI
•   7.0英寸分辨率为800x480(WVGA)  像素密度128PPI
•   7.0英寸分辨率为1024*600      像素密度169PPI
•   7.0英寸分辨率为1280*800      像素密度216PPI
•   9.7英寸分辨率为1024x768(XGA),像素密度132ppi
•   9.7英寸分辨率为2048x1536,   像素密度264PPI

Cocos2d-x2.0.4开始,Cocos2d-x提出了自己的多分辨率从支持方案,废弃了之前的retina相关设置接口,提出了designresolution概念

designresolution 目的是屏蔽设备分辨率,精灵坐标都在designresolution上布局,但要实现这个目标并不简单。Cocos2d-x提供了一组相关的接口和5种分辨率适配策略,哪种策略才是我们需要的,下面我们一同探寻。

•有以下相关接口:

// 设计分辨率大小及模式
•CCEGLView::sharedOpenGLView()->setDesignResolutionSize(DW,DH, resolutionPolicy);
// 内容缩放因子
• CCDirector::sharedDirector()->setContentScaleFactor();
// 资源搜索路径
•CCFileUtils::sharedFileUtils()->setSearchPaths();
// 屏幕分辨率
•CCEGLView::sharedOpenGLView()->getFrameSize();
// 设计分辨率
CCDirector::sharedDirector()->getWinSize();
 // 设计分辨率可视区域大小
CCDirector::sharedDirector()->getVisibleSize();
// 设计分辨率可视区域起点
CCDirector::sharedDirector()->getVisibleOrigin();

Cocos2d-x为我们提供了5种策略:

enum ResolutionPolicy

{

kResolutionExactFit,

kResolutionShowAll,

kResolutionNoBorder,

kResolutionFixedHeight, //Cocos2d-x2.1.3

kResolutionFixedWidth,

};

资源分辨率,设计分辨率,屏幕分辨率
Resourceswidth 以下简写为RW
Resourcesheight以下简写为RH
Designwidth 以下简写为DW
Designheight以下简写为DH
Screenwidth 以下简写为SW
Screenheight以下简写为SH


Cocos2d-x图片显示有下面两个逻辑过程。资源布局à设计分辨率,设计分辨率布局à屏幕。



接口setContentScaleFactor()setSearchPaths()控制着第一个转换过程。setDesignResolutionSize()控制第二个过程。两个过程结合在一起,影响最终的显示效果。


从资源分辨率到设计分辨率

setSearchPaths()需要根据当前屏幕分辨率做恰当的设置
setContentScaleFactor()决定了图片显示到屏幕的缩放因子,但是这个接口的参数不是通过资源图片的宽、高比屏幕宽、高得来。Cocos2d-x引擎设计试图屏蔽游戏开发者直接去关注屏幕,所以这个因子是资源宽、高比设计分辨率宽、高。
setContentScaleFactor()通常有两个方式来设置参数。
RH/DHRW/DW,不同的因子选择有不同的缩放作用

先看一张图:





用高度比作为内容缩放因子,保证了背景资源的垂直方向在设计分辨率范围内的全部显示。

用宽度比作为内容缩放因子,保证了背景资源的水平方向在设计分辨率范围内的全部显示。

从设计分辨率到屏幕分辨率

setDesignResolutionSize(DW, DH, resolutionPolicy);
•有三个参数,设计分辨率宽,设计分辨率高,分辨率策略。
前两个很好理解,复杂点在分辨率策略的选择上。
•先来看kResolutionExactFit,kResolutionNoBorder,kResolutionShowAll这三种情况,2.1.3新加入的策略稍后分析。
三种策略的设计分辨率都是传入值,内部不做修正。

再来看一张图


kResolutionShowAll
屏幕宽、高分别和设计分辨率宽、高计算缩放因子,取较()者作为宽、高的缩放因子。保证了设计区域全部显示到屏幕上,但可能会有黑边
kResolutionExactFit
屏幕宽 与 设计宽比 作为X方向的缩放因子,屏幕高与 设计高比 作为Y方向的缩放因子。保证了设计区域完全铺满屏幕,但是可能会出现图像拉伸

kResolutionNoBorder
•    屏幕宽、高分别和设计分辨率宽、高计算缩放因子,取较()者作为宽、高的缩放因子。保证了设计区域总能一个方向上铺满屏幕,而另一个方向一般会超出屏幕区域。
     kResolutionNoBorder是之前官方推荐使用的方案,他没有拉伸图像,同时在一个方向上撑满了屏幕,但是2.1.3新加入的两种策略将撼动kResolutionNoBorder的地位
kResolutionFixedHeight kResolutionFixedWidth
是会在内部修正传入设计分辨率,以保证屏幕分辨率到设计分辨率无拉伸铺满屏幕

如图:


kResolutionFixedHeight
•保持传入的设计分辨率高度不变,根据屏幕分辨率修正设计分辨率的宽度
•kResolutionFixedWidth
•保持传入的设计分辨率宽度不变,根据屏幕分辨率修正设计分辨率的高度

结合两个过程
•第一过程有两种情况,第二过程有5种情况,在一个分辨率下会有10种可能的方案组合。
如何选择自己需要的?
我们需要作出选择,是牺牲效果还是牺牲部分显示区域。
•
在我的游戏里面,背景图的高需要全部显示,而宽方向可以裁减。
•要实现这个目的,需要保证两个过程都是在宽方向裁减。
•第一过程选择 setContentScaleFactor(RH/DH)
•第二过程有两个选择:kResolutionNoBorder和kResolutionFixedHeight
•为了说明两者的区别,需要结合VisibleOrigin和VisibleSize。




kResolutionNoBorder模式:


kResolutionNoBorder情况下,设计分辨率并不是可见区域,我们布局精灵需要根据VisibleOrigin和VisibleSize来做判断处理。
•而 kResolutionFixedHeight则不同,设计分辨率就是可见区域,VisibleOrigin总是(0,0)
getVisibleSize() = getWinSize(),kResolutionFixedHeight达到了同样的目的,但是却简化了代码。
•kResolutionFixedHeight和kResolutionFixedWidth是kResolutionNoBorder的进化,新项目中建议立即开始使用这两种方式。

•小结:
kResolutionFixedHeight
•适合高方向需要撑满,宽方向可裁减的游戏,结合setContentScaleFactor(RH/DH)使用。
kResolutionFixedWidth
•适合宽方向需要撑满,高方向可裁减的游戏,结合setContentScaleFactor(RW/DW)使用。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值