@H_403_0@准备
@H_403_0@first: @H_403_0@利用cocos studio创建一个scene,在其中添加一些基本元素,如背景,text,button等 @H_403_0@本文设计的为 640x960的场景,如: @H_403_0@
@H_403_0@将上面的场景发布到visual studio中,然后我们开始测试编辑,首先在AppDelegate.cpp中进行相关设置 @H_403_0@second:
@H_403_0@介绍一下VisibleSize,WinSize,FrameSize, VisibleOrigin之间的联系和区别 @H_403_0@(参考:http://www.jb51.cc/article/p-tiqzxfjo-gv.html) @H_403_0@FrameSize: 屏幕实际分辨率,固定不变的,由设备(即具体的手机自己决定) @H_403_0@WinSize: 设计分辨率,相当于游戏设计的逻辑大小(即我们计划的游戏场景大小)
@H_403_0@VisibleSize: 显示分辨率,总是小于等于WinSize的
@H_403_0@VisibleOrigin: 即VisibleSize在WinSize中的左下角坐标
@H_403_0@e.g:
@H_403_0@FrameSize-> width:720,height:420
@H_403_0@WinSize-> width:360,height:240
@H_403_0@在无ResolutionPolicy::NO_BORDER的条件下为:(NO_BORDER的具体意义下面讲述) @H_403_0@ @H_403_0@third: @H_403_0@ setDesignResolutionSize(DW, DH, resolutionPolicy) @H_403_0@有三个参数,设计分辨率宽,设计分辨率高,分辨率策略。 @H_403_0@ResolutionPolicy::SHOW_ALL :屏幕宽、高分别和设计分辨率宽、高计算缩放因子,取较(小)者作为宽、高的缩放因子。保证了设计区域全部显示到屏幕上,但可能会有黑边。 @H_403_0@ResolutionPolicy::SHOW_FIT:屏幕宽 与 设计宽比 作为X方向的缩放因子,屏幕高 与 设计高比 作为Y方向的缩放因子。保证了设计区域完全铺满屏幕,但是可能会出现图像拉伸 @H_403_0@ResolutionPolicy::NO_BORDER: 屏幕宽、高分别和设计分辨率宽、高计算缩放因子,取较(大)者作为宽、高的缩放因子。保证了设计区域总能一个方向上铺满屏幕,而另一个方向一般会超出屏幕区域 @H_403_0@
@H_403_0@测试FrameSize,VisableSize之间关系
@H_403_0@first :
@H_403_0@原始图像如上所示,现在我们假设设备FramSize(640,960),设置FramSize为(320,480),则显示结果为 @H_403_0@glview->setFrameSize(640,960); @H_403_0@director->getOpenGLView()->setDesignResolutionSize(320,480,ResolutionPolicy::SHOW_ALL); @H_403_0@
@H_403_0@如果将WinSize设置为 (640, 960): @H_403_0@glview->setFrameSize(640, 960); @H_403_0@director->getOpenGLView()->setDesignResolutionSize(640,960,ResolutionPolicy::SHOW_ALL); @H_403_0@----》因为屏幕太小,所以没有能完全显示出来,理论上是ok的 @H_403_0@
@H_403_0@
@H_403_0@换算成: @H_403_0@glview->setFrameSize(320,480); @H_403_0@director->getOpenGLView()->setDesignResolutionSize(640,ResolutionPolicy::SHOW_ALL); @H_403_0@---->winSize---width:640,height:960 @H_403_0@---->visibleSize---width:640,height:960 @H_403_0@
@H_403_0@
@H_403_0@测试适配问题
@H_403_0@上面测试的FrameSize和VisibleSize之间正好成比例,那么不成比例的情况呢,如
@H_403_0@glview->setFrameSize(320,500); @H_403_0@director->getOpenGLView()->setDesignResolutionSize(640,ResolutionPolicy::SHOW_ALL); @H_403_0@-------------------------------------------------------------------------------------------------------------- @H_403_0@glview->setFrameSize(340,ResolutionPolicy::SHOW_ALL); @H_403_0@
@H_403_0@最常用的分辨率策略是SHOW_ALL,那么上面的问题如何解决? @H_403_0@在 show all 的基础上加以改进,完全消除黑边,原理如下: @H_403_0@show all表示保证图片资源全部能够显示在界面上,因此按比例进行缩放时,是有选择的,我们举例说明: @H_403_0@放大----> @H_403_0@设 FrameSize: dw,dh,VisibleSize: vw,vh
@H_403_0@缩放比例为: sx = dw / vw,sy = dh / vh -----> 如 sx=2,sy=3,全部显示时,需要将资源宽放大两倍,高放大三倍,故此处选择的将是统一放大两倍,即高将填不满,有黑边,考虑将vh放大一点也达到dh的一半
@H_403_0@ 即这里选择方案将是重设vh = dh / sx
@H_403_0@---> 放大时,选择较小的比例
@H_403_0@if sx < sy then vh=dh/sx @H_403_0@然后整体的放大sx倍即可完美的填充界面
@H_403_0@缩小时-----> @H_403_0@ 正和上面相反,假设sx=0.25,sy=0.5 -----> 按照show_all的原则,选择宽填满,缩小1/4,此时可以知道高将有空白黑边,因此需要放大vh为之前的两倍才有可能在缩小1/4的时候恰好填充屏幕
@H_403_0@即这里选择方案是重设
@H_403_0@if sx < sy then vw = dw/sy @H_403_0@这里,通过实际测试,发现: @H_403_0@---->在WinSize小于FrameSize的时候,即需要缩小图片时,可以采用下面的来实现: @H_403_0@
float deviceWidth = 300; float deviceHeight = 460; float designWidth = 640; float designHeight = 960; float scaleX = deviceWidth / designWidth; float scaleY = deviceHeight / designHeight; if(scaleX > scaleY) // 这里是区别处 designHeight = deviceHeight / scaleX; else designWidth = deviceWidth / scaleY; log("design: %f %f %f %f\n",designWidth,designHeight,scaleX,scaleY); director->getOpenGLView()->setDesignResolutionSize(designWidth,ResolutionPo
---->当WinSize大于FrameSize的时候,即需要放大图片时,采用 @H_403_0@
float deviceWidth = 300; float deviceHeight = 460; float designWidth = 640; float designHeight = 960; float scaleX = deviceWidth / designWidth; float scaleY = deviceHeight / designHeight; if(scaleX < scaleY) // ------------> 区别处 designHeight = deviceHeight / scaleX; else designWidth = deviceWidth / scaleY; log("design: %f %f %f %f\n",ResolutionPolicy::SHOW_ALL);