1.设计分辨率
你配资源使用的分辨率大小,一般是960*640。
2.屏幕分辨率
实际上用户屏幕的分辨率大小。
想要了解更多建议阅读
http://www.tairan.com/archives/6508/
的文章
你需要了解的有:
ResolutionPolicy::SHOW_ALL
屏幕宽、高分别和设计分辨率宽、高计算缩放因子,取较(小)者作为宽、高的缩放因子。保证了设计区域全部显示到屏幕上,但可能会有黑边。
ResolutionPolicy::EXACT_FIT
屏幕宽 与 设计宽比 作为X方向的缩放因子,屏幕高 与 设计高比 作为Y方向的缩放因子。保证了设计区域完全铺满屏幕,但是可能会出现图像拉伸。
ResolutionPolicy::NO_BORDER
屏幕宽、高分别和设计分辨率宽、高计算缩放因子,取较(大)者作为宽、高的缩放因子。保证了设计区域总能一个方向上铺满屏幕,而另一个方向一般会超出屏幕区域。
ResolutionPolicy::FIXED_HEIGHT
保持传入的设计分辨率高度不变,根据屏幕分辨率修正设计分辨率的宽度。
ResolutionPolicy::FIXED_WIDTH
如果是横屏游戏使用FIXED_HEIGH。横屏使用FIXED_WIDTH。保持传入的设计分辨率宽度不变,根据屏幕分辨率修正设计分辨率的高度。
在载入游戏资源时我写了三个函数
1.setNodeScaleMin()
设置节点以屏幕宽高比设计分辨率宽高的较小者缩放(适用于控件)
2.setNodeScaleMan()
设置节点以屏幕宽高比设计分辨率宽高的较大者缩放(适用于背景)
3.setFixNodePosition()
修复资源因为FIXED_HEIGH设置后屏幕出现的平移
在场景节点或者UI节点动态加入时设置一下缩放和平移即可。
这种解决方法对于ipad不是很友好。这取决与你的设计分辨率。如果你是16*9比例的设计分辨率不管怎么做适配,在ipad上都是会有些奇怪的。
这里是实现代码,对于场景节点使用fixScene修正,对于UI节点使用fixUI修正
--[[ @brief:功能函数类 @by李俊 ]] wolf=wolf or{} localFixUIUtils={} localBUI=bf.UIManager:getInstance() ---自定义CocosStudio屏幕像素 localdesignSize=cc.size( 1280,800) localscreenSize=cc.Director:getInstance():getWinSize() localminScale=math. min(screenSize.height/designSize.height,screenSize.width/designSize.width) localmaxScale=math. max(screenSize.height/designSize.height,screenSize.width/designSize.width) --屏幕宽、高分别和设计分辨率宽、高计算缩放因子,取较(小)者作为宽、高的缩放因子。 --适用于控件的缩放 functionFixUIUtils.setScaleMin(node) localnodeX=node:getScaleX() localnodeY=node:getScaleY() nodeX=nodeX*minScale nodeY=nodeY*minScale node:setScaleX(nodeX) node:setScaleY(nodeY) end --屏幕宽、高分别和设计分辨率宽、高计算缩放因子,取较(大)者作为宽、高的缩放因子。 --适用于背景的缩放 functionFixUIUtils.setScaleMax(node) localnodeY=node:getScaleY() nodeX=nodeX*maxScale nodeY=nodeY*maxScale node:setScaleX(nodeX) node:setScaleY(nodeY) functionFixUIUtils.setRootNodewithFIXED() localmoveX=(designSize.width-screenSize.width)/ 2 localmoveY=(designSize.height-screenSize.height)/ 2 BUI:getSceneRoot():setPosition(cc.p(-moveX,-moveY)) functionFixUIUtils.fixScene() localnode=BUI:getSceneRoot() localChildrenList=node:getChildren() for_,child inpairs(ChildrenList) do localname=child:getName() if(name== "SceneBack") then FixUIUtils.setScaleMax(child) else FixUIUtils.setScaleMin(child) end end FixUIUtils.setRootNodewithFIXED() functionFixUIUtils.fixUI(node) end end |
这里是大厅场景的适配制作。主要的难点是锚点选对,因为缩放时根据锚点位置不变进行缩放的。还有就是命名为SceneBack节点的背景是(大)放大的。
这个是UI节点的配置。都要保证是中心缩放的。