作为游戏的新一代时尚载体,手机技术发展日新月异,不仅是性能提高,屏幕尺寸也日渐多样化,但这对游戏开发者也带来分辨率匹配的问题。本节课将讲解由Cocos2d-x提供的:如何匹配不同分辨率手机屏幕办法中的设计分辨率部分。

教学视频

 

课程笔记

不同的分辨率按照怎样的方式缩放元素:

1、根据不同的屏幕分辨率设计不同的元素缩放比例

2、通过函数获取屏幕尺寸,根据屏幕尺寸按照一定比例设置元素

3、按照一个预定义的分辨率设计,由游戏引擎来根据这个分辨率针对不同的实际屏幕分辨率进行调整。

在第3种情况中,开发者定义设计分辨率,并提供给游戏引擎缩放系数(缩放策略);以及资源缩放因子用于对资源的尺寸进行调整。

缩放策略:

1、ResolutionPolicy::EXACT_FIT,满屏显示,可能会由于宽高比不同,出现比例不协调的现象。视口为屏幕分辨率,绘制区域是设计分辨率表示的区域,绘制原点为设计分辨率对应区域的原点。

2、ResolutionPolicy::NO_BORDER,超过屏显示,以较大的缩放系数为准,内容会显示到屏幕外,然后被裁剪。居中显示,视口大于屏幕分辨率,绘制区域是设计分辨率表示的区域,绘制原点为设计分辨率对应区域的原点。

3、ResolutionPolicy::SHOW_ALL,小于屏显示,以较小的缩放系数为准,内容全部都会显示到屏幕内,可能出现黑边。居中显示,视口小于屏幕分辨率,绘制区域是设计分辨率表示的区域,绘制原点为设计分辨率对应区域的原点。

4、ResolutionPolicy::FIXED_xxxxx,以指定边的缩放系数为准,可能满屏显示,也可能出现空白。视口等于屏幕分辨率,绘制区域不是设计分辨率表示的区域,而是实际的屏幕分辨率,所以写应用程序的时候不能写绝对值坐标。(当然固定的这个边是可以写固定值的)

有用的变量:

Director::getInstance()->getWinSize()可得到绘制区域的分辨率,在ResolutionPolicy::NO_BORDER会超过实际分辨率,在ResolutionPolicy::SHOW_ALL会小于实际分辨率,在ResolutionPolicy::EXACT_FIT、ResolutionPolicy::FIXED_xxxxx等于实际分辨率。

Director::getInstance()->getVisibleSize()可得到绘制区域在可视区域的分辨率。

Director::getInstance()->getWinSizeInPixels()可得到绘制区域在OpenGL ES的真实区域的大小。

Director::getInstance()->getVisibleOrigin()可得到可视区域原点在绘制区域的位置,仅当ResolutionPolicy::NO_BORDER的情况下有用。

GLView::getFrameSize()可得到实际屏幕分辨率。Director::convertToUI用于返回一个基于设备UI系统的坐标值。

GLView::setDesignResolutionSize会导致viewport、透视矩阵、观察点位置的重新设置。setViewPortInPoints会将设计分辨率转换为基于屏幕实际像素大小的坐标信息。而透视投影矩阵、观察点的位置都是根据_winSizeInPoints设计的。