cocos2d-x屏幕适配

来源:互联网 发布:网络象棋 编辑:程序博客网 时间:2024/06/05 23:44
设计分辨率和屏幕分辨率: 
首先我们需要了解两个概念:在Cocos2d-x中有两种分辨率:设备分辨率、屏幕分辨率。设备分辨率即当前游戏所运行平台的实际分辨率;设计分辨率就是我们设计的游戏的分辨率。 
设计分辨率是可设置的,是我们的游戏程序能够“感知到”的分辨率大小,我们的界面超过这个区域的部分都不会显示。 
设计分辨率一般在启动时进行设置,demo里边的相关设置在AppDelegate:: applicationDidFinishLaunching中进行,代码如下: 
director->getOpenGLView()->setDesignResolutionSize(960,640,ResolutionPolicy::FIXED_HEIGHT); 
(这句代码上边还有一句createWithRect这个是在桌面系统上,创建游戏模拟器用的。可以修改里边的Rect的后边两个值来修改设备分辨率,但这个值在移动设备上是无效的。) 
这句代码什么意思呢? 
这里把设计分辨率设置为960,640,并把游戏界面调整方案设置为固定宽度。但这么设置之后,我们后边再获取设计分辨率时得到的大小却不一定是960,640。这又是为什么呢? 
看看源码(侯捷大爷那句“源码面前,了无秘密~”在耳边缭绕。): 
转到setDesignResolutionSize的定义看看。里边做了一些判断和赋值,最终调用了updateDesignResolutionSize,继续转到updateDesignResolutionSize里边,这个函数的部分代码如下: 
//1.计算游戏界面在缩放至充满屏幕的情况下XY轴的缩放率:
_scaleX= (float)_screenSize.width/_designResolutionSize.width;
_scaleY= (float)_screenSize.height/_designResolutionSize.height;
//2.根据设配策略,调整缩放率和设计分辨率:
if(_resolutionPolicy==ResolutionPolicy::NO_BORDER)
{//XY轴缩放值设置为其中的最大者
_scaleX =_scaleY =MAX(_scaleX,_scaleY);
}
elseif(_resolutionPolicy==ResolutionPolicy::SHOW_ALL)
{//XY轴缩放值设置为其中的最小者
_scaleX =_scaleY =MIN(_scaleX,_scaleY);
}
elseif(_resolutionPolicy ==ResolutionPolicy::FIXED_HEIGHT) {
_scaleX =_scaleY;//XY轴缩放值固定为Y轴缩放值,调整设计分辨率的宽度,使设计分辨率的宽度在缩放后依然能够充满屏幕。
_designResolutionSize.width=ceilf(_screenSize.width/_scaleX);
}
elseif(_resolutionPolicy ==ResolutionPolicy::FIXED_WIDTH) {
_scaleY=_scaleX;//XY轴缩放值固定为X轴缩放值,调整设计分辨率的高度,使设计分辨率的高度在缩放后依然能够充满屏幕。
_designResolutionSize.height=ceilf(_screenSize.height/_scaleY);
}
//其他缩放策略:EXACT_FIT不作调整
这段代码主要做了两件事:
1.根据设备分辨率和设计分辨率计算游戏界面的缩放率;
2.调整设计分辨率。
根据以上源码我们应该很容易就能够理解几种缩放策略的意义:
·NO_BORDER就是在保持设计分辨率大小不变的情况下,将游戏界面按比例缩放至充满屏幕。游戏的上下或者左右两边可能会被裁剪。
·SHOW_ALL(Cocos2d-x默认方案)就是在保持设计分辨率大小不变的情况下,将游戏界面按比例缩放至设计分辨率的其中一边顶住屏幕。游戏上下或者左右两边可能会有黑边。
·FIXED_HEIGHT就是固定设计分辨率的高度,调整设计分辨率的宽度,使设计分辨率的长宽比与设备分辨率的长宽比相同,然后缩放游戏界面至充满屏幕。
·FIXED_WIDTH同上,不同的是保持宽度不变。
·EXACT_FIT是最粗暴的方式,直接将游戏界面缩放到充满整个屏幕,XY轴缩放比率不一定一致。
那么。。。我们应该选择哪个方案呢?必然的我们应该选择FIXED_HEIGHT或者FIXED_WIDTH。因为只有这两个方案下,界面是会自动根据设备分辨率调整设计分辨率的大小并且充满屏幕
0 0
原创粉丝点击