原文链接:http://gpra.pkstudio.org/archives/217
cocos2d-x是一个优秀的跨平台游戏引擎,当然跨平台超容易遇到的分辨率适配问题,cocos2d-x也提供了超好用的解决方案。
官方的多分辨率适配wiki页面在这里:http://www.cocos2d-x.org/projects/cocos2d-x/wiki/Multi_resolution_support
当然这是E文的教程,而且有些细节官方也没有说清楚,下面就开始我自己的一些见解了。
====本教程基于cocos2d-x-2.1.4撰写====
1.setDesignResolutionSize使用方法及主要的三种适配模式
在cocos2d-x 2.0里,提供了一个叫做setDesignResolutionSize的方法,直接一次设置就可以自动适配各种分辨率。这个方法的注释如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
enum ResolutionPolicy
{
kResolutionExactFit,
kResolutionNoBorder,
kResolutionShowAll,
kResolutionFixedHeight,
kResolutionFixedWidth,
kResolutionUnKnown,
};
/**
* Set the design resolution size.
* @param width Design resolution width.
* @param height Design resolution height.
* @param resolutionPolicy The resolution policy desired,you may choose:
* [1] kResolutionExactFit Fill screen by stretch-to-fit: if the design resolution ratio of width to height is different from the screen resolution ratio,your game view will be stretched.
* [2] kResolutionNoBorder Full screen without black border: if the design resolution ratio of width to height is different from the screen resolution ratio,two areas of your game view will be cut.
* [3] kResolutionShowAllFull screen with black border: if the design resolution ratio of width to height is different from the screen resolution ratio,two black borders will be shown.
*/
virtual void setDesignResolutionSize(float width,float height,ResolutionPolicy resolutionPolicy);
|
这个方法的使用很简单,在游戏启动过程的 pDirector->setOpenGLView(pEGLView); 行之后,直接调用一次就好。调用完了之后,CCDirector->WinSize就会变更为你设定的分辨率,之后就按照这个WinSize进行开发就好了,当然有些时候还是需要一些注意一些额外的地方后面会提到。
这个方法的作用简单来说,就是我们可以只按照一套指定的分辨率设计游戏,称之为design resolution。然后选择合适的适配方案,引擎就会在你的design resolution的基础上进行缩放操作,使得按照指定分辨率设计的游戏可以适配各种分辨率。
具体的主要适配方案主要有以下三种,为了方便理解还会配图说明,先举一个例子:
这是我们的实际屏幕尺寸,有宽屏568×320和正屏480×360两种:
而这是我们设定的design resolution 480×320:
1) kResolutionExactFit:强制拉伸游戏方案,这个方案实用性很低,用暴力的拉伸直接将游戏拉伸到全屏,会导致图片比例失真
2) kResolutionNoBorder:无黑边保持高宽比拉伸方案,这个方案最美观,但是等比拉伸会导致左右或上下总会有一部分显示到屏幕外,需要自己去保证UI元素不会显示在屏幕外
(可以看到如果我们按照design resolution直接设计UI,贴在上下两侧的按钮等就可能显示到屏幕外了。但是实际上cocos2d-x有提供方案来帮助帮助我们保证UI元素绘制在屏幕内,后面的内容会提到具体方法。)
3) kResolutionShowAll:有黑边保持宽高比全显示拉伸方案,这个方案在在上两种方案之间,保持了宽高比也显示了全部内容,但是会在屏幕两侧留下黑边
(可以看到design resolution和实际屏幕宽高比相差太大的话黑边会比较多,但是这个方案是设计时最省心的)
三种适配模式都讲解完了,大家对选用哪种模式应该自己心里也都有数了。实际上最省心的方案就是找一个宽高比居中的design resolution,然后如果选用方案2的话就额外注意把元素都不要摆的太靠边就OK了。
不过这样做出来的游戏显得对用户体验太不上心了,个人觉得至少要检测一下屏幕的实际宽高比,对宽屏和正屏系列采用两套以上分辨率才可以。确定最合适的分辨率需要事先考察一下主流的屏幕分辨率,这里为了方便把分辨率统一转换成宽高比方便比较:
(安卓设备分辨率来自http://developer.android.com/guide/practices/screens_support.html#testing)
iPad:1.333: 1
iPhone5:1.775: 1
iPhone4(s):1.5: 1
WVGA800(800×480):1.667: 1
WVGA854(854×480):1.779: 1
1024×600:1.707: 1
WXGA(1280×800):1.6: 1
1024×768:1.333: 1
1280×768:1.667: 1
综上观察手持设备的分辨率再多,大部分也都遵循了显示器界4:3、16:9、16:10三大主流宽高比,iPhone4(s)算是略特殊的一个宽高比。基于这个统计,再根据游戏主推的平台,就可以确定两到三个主支持分辨率来进行设计了。当然,根据高清设备采用一个高清的分辨率方案,有时也是很必要的。
2. 关于getVisibleSize和getVisibleOrigin
针对上文中kResolutionNoBorder模式下,游戏UI有可能绘制到屏幕外的问题,有没有什么好的处理办法?答案是有,cocos2d-x为我们准备了方法来获取真正的可视范围,详情见这两个方法:
@H_502_148@
1
2
3
4
5
6
7
8
9
|
/**
* Get the visible area size of opengl viewport.
*/
virtual CCSize getVisibleSize() const;
/**
* Get the visible origin point of opengl viewport.
*/
virtual CCPoint getVisibleOrigin() const;
|