cocos2dx3.x+cocostudio多屏幕分辨率适配解决方案(干货)

版本cocos2dx3.3
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 {}
local FixUIUtils = {}
local BUI = bf.UIManager:getInstance()
---自定义Cocos Studio屏幕像素
local designSize = cc.size( 1280800)
local screenSize = cc.Director:getInstance():getWinSize()
local minScale = math. min(screenSize.height/designSize.height,screenSize.width/designSize.width)
local maxScale = math. max(screenSize.height/designSize.height,screenSize.width/designSize.width)

--屏幕宽、高分别和设计分辨率宽、高计算缩放因子,取较(小)者作为宽、高的缩放因子。
--适用于控件的缩放
function FixUIUtils.setScaleMin(node)
     local nodeX = node:getScaleX()
     local nodeY = node:getScaleY()
    nodeX = nodeX*minScale
    nodeY = nodeY*minScale
    node:setScaleX(nodeX) 
    node:setScaleY(nodeY) 
end

--屏幕宽、高分别和设计分辨率宽、高计算缩放因子,取较(大)者作为宽、高的缩放因子。
--适用于背景的缩放
function FixUIUtils.setScaleMax(node)
     local nodeX = node:getScaleX()
     local nodeY = node:getScaleY()
    nodeX = nodeX*maxScale
    nodeY = nodeY*maxScale
    node:setScaleX(nodeX) 
    node:setScaleY(nodeY) 
end

function FixUIUtils.setRootNodewithFIXED()
     local moveX = (designSize.width-screenSize.width)/ 2
     local moveY = (designSize.height-screenSize.height)/ 2
    BUI:getSceneRoot():setPosition(cc.p(-moveX ,-moveY))
end

function FixUIUtils.fixScene() 
     local node = BUI:getSceneRoot()
     local ChildrenList = node:getChildren()
     for _,child  in pairs(ChildrenList)  do
         local name = child:getName()
         if(name== "SceneBack"then
            FixUIUtils.setScaleMax(child)
         else
            FixUIUtils.setScaleMin(child)
         end
     end
    FixUIUtils.setRootNodewithFIXED()
end

function FixUIUtils.fixUI(node)
     local ChildrenList = node:getChildren()
     for _,child  in pairs(ChildrenList)  do
         local name = child:getName()
         if(name== "SceneBack"then
            FixUIUtils.setScaleMax(child)
         else
            FixUIUtils.setScaleMin(child)
         end
     end
end

这里是大厅场景的适配制作。主要的难点是锚点选对,因为缩放时根据锚点位置不变进行缩放的。还有就是命名为SceneBack节点的背景是(大)放大的。

这个是UI节点的配置。都要保证是中心缩放的。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值