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節點的配置。都要保證是中心縮放的。


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM