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),你猜这个坐标的位置在哪?
还是你以为的窗口正中间吗?显然不是。他在黑框的上边框的中间。
到这儿,你就可以推算出其他两种适配方法的坐标关系了。

浙公网安备 33010602011771号