Cocos2d-x的多分辨率支持教程(1)
随着手机技术的飞速发展,作为游戏的新一代时尚载体,手机不仅性能大幅提升,屏幕尺寸也日益多样化。这给游戏开发者带来了分辨率匹配的难题。本节课将详细讲解Cocos2d-x提供的匹配不同分辨率手机屏幕方法中的设计分辨率部分。
教学视频
(此处应补充教学视频的相关内容,如视频链接等,原文未给出有效信息)
课程笔记
不同分辨率下元素的缩放方式
- 根据不同屏幕分辨率设计不同的元素缩放比例:针对不同的屏幕分辨率,分别为游戏元素设计特定的缩放比例。
- 通过函数获取屏幕尺寸并按比例设置元素:利用函数获取当前屏幕的尺寸,然后根据该尺寸按照一定的比例来设置游戏元素的大小和位置。
- 按预定义分辨率设计,由游戏引擎调整:开发者先定义一个设计分辨率,然后为游戏引擎提供缩放系数(即缩放策略),同时提供资源缩放因子用于调整资源的尺寸,由游戏引擎根据这个预定义的分辨率针对不同的实际屏幕分辨率进行适配。
缩放策略
- ResolutionPolicy::EXACT_FIT:满屏显示。但由于不同屏幕的宽高比可能不同,使用该策略可能会导致游戏元素比例不协调。视口为屏幕分辨率,绘制区域是设计分辨率表示的区域,绘制原点为设计分辨率对应区域的原点。
- ResolutionPolicy::NO_BORDER:超过屏显示。以较大的缩放系数为准,内容会超出屏幕显示,超出部分会被裁剪。画面居中显示,视口大于屏幕分辨率,绘制区域是设计分辨率表示的区域,绘制原点为设计分辨率对应区域的原点。
- ResolutionPolicy::SHOW_ALL:小于屏显示。以较小的缩放系数为准,内容会全部显示在屏幕内,但可能会出现黑边。画面居中显示,视口小于屏幕分辨率,绘制区域是设计分辨率表示的区域,绘制原点为设计分辨率对应区域的原点。
- 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设计的。