Cocos2d-x 多分辨率适配

以下为引擎分辨率文档:

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

setDesignResolutionSize(DW, DH, resolutionPolicy)

有三个参数,设计分辨率宽,设计分辨率高,分辨率策略。

前两个很好理解,复杂点在分辨率策略的选择上。

先来看ResolutionPolicy::EXACT_FIT,ResolutionPolicy::NO_BORDER,ResolutionPolicy::SHOW_ALL这三种情况,2.1.3新加入的策略稍后分析。

三种策略的设计分辨率都是传入值,内部不做修正。

ResolutionPolicy::SHOW_ALL

屏幕宽、高分别和设计分辨率宽、高计算缩放因子,取较(小)者作为宽、高的缩放因子。保证了设计区域全部显示到屏幕上,但可能会有黑边。

ResolutionPolicy::EXACT_FIT

屏幕宽 与 设计宽比 作为X方向的缩放因子,屏幕高 与 设计高比 作为Y方向的缩放因子。保证了设计区域完全铺满屏幕,但是可能会出现图像拉伸。

ResolutionPolicy::NO_BORDER

屏幕宽、高分别和设计分辨率宽、高计算缩放因子,取较(大)者作为宽、高的缩放因子。保证了设计区域总能一个方向上铺满屏幕,而另一个方向一般会超出屏幕区域。

ResolutionPolicy::NO_BORDER是之前官方推荐使用的方案,他没有拉伸图像,同时在一个方向上撑满了屏幕,但是2.1.3新加入的两种策略将撼动ResolutionPolicy::NO_BORDER的地位。

ResolutionPolicy::FIXED_HEIGHT和ResolutionPolicy::FIXED_WIDTH都是会在内部修正传入设计分辨率,以保证屏幕分辨率到设计分辨率无拉伸铺满屏幕。 如图:

ResolutionPolicy::FIXED_HEIGHT

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

ResolutionPolicy::FIXED_WIDTH

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

 

备注:

ResolutionPolicy::NO_BORDER情况下,设计分辨率并不是可见区域,我们布局精灵需要根据VisibleOrigin和VisibleSize来做判断处理。

而ResolutionPolicy::FIXED_HEIGHT则不同,设计分辨率就是可见区域,VisibleOrigin总是(0,0)

getVisibleSize() = getWinSize(),ResolutionPolicy::FIXED_HEIGHT达到了同样的目的,但是却简化了代码。

ResolutionPolicy::FIXED_HEIGHT和ResolutionPolicy::FIXED_WIDTH是ResolutionPolicy::NO_BORDER的进化,新项目中建议立即开始使用这两种方式。

 

以下内容为NO_BORDER方案的坐标分析

(1) glview=GLView::createWithRect(“MY  GAME”,Rect(0,0,480,640));

创建一个名为MY GAME且宽和高尺寸分别为480和640的win32窗口,其实就是将来的手机屏幕大小。

 

(2) glview->setDesignResolutionSize(480,320 ,kResolutionNoBorder );

 

 以下是获取相应的值得代码

Size  visibleSize  = Director::getInstance()->getVisibleSize();

//通过获得在win32窗口的长宽尺寸大小下适配的相应的像素点数目,从而得到适配后的显示在窗口中的宽高尺寸大小

Vec2  origin      = Director::getInstance()->getVisibleOrigin()

 

//得到屏幕原点(左下角)的坐标

以下是经测试得到的数据

visibleSize.width=240      visibleSize.height=320

origin.x=120                       origin .y=0

注意这里,我并没有添加任何背景图层,所以win32窗口尺寸大小适配分辨率尺寸大小后的关系是看不到的。下图是自己做的尺寸大小关系图

如图 黑框部分是win32窗口(480,640),红框是适配分辨率后的窗口(480,320)但其实你是看不到黑框以外的那一部分的,这里为了能更好的理解他们之间的关系,所以我就把没有显示的那一部分也画出来了。

上图中关系是:黑框的宽(尺寸)480对应240个像素点,黑框的高(尺寸)640对应320个像素点。

黑框左下角的坐标为(120,0),右上角坐标(360,320)

红框左下角的坐标(0,0),   右上角坐标(480,320)(红框的这两个坐标你是看不到的)

 

这里就可以看出来,所有的坐标与win32窗口的尺寸大小没有任何关系了,更确切的说与将来手机的屏幕大小没有关系了,即达到了适配效果。

还有,你接下的所有操作都是建立在适配的坐标下,与win32窗口(480,640)尺寸大小没有任何联系。比如随便找个坐标(240,320),你猜这个坐标的位置在哪?

还是你以为的窗口正中间吗?显然不是。他在黑框的上边框的中间。

到这儿,你就可以推算出其他两种适配方法的坐标关系了。

 

posted @ 2016-09-05 15:48  Jensen抹茶喵  阅读(240)  评论(0)    收藏  举报