zoukankan      html  css  js  c++  java
  • 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节点的配置。都要保证是中心缩放的。


  • 相关阅读:
    facebook's HipHop for PHP: Move Fast
    使用Linux(CentOS)搭建SVN服务器全攻略
    PHP内置的预定义常量大全
    用PHP纯手工打造会动的多帧GIF图片验证码
    PHP的unset究竟会不会释放内存?
    请远离include_once和require_once
    真希望能夠統一一下接口
    Linux下同步网络时间
    mongo 报connect@src/mongo/shell/mongo.js:251:13错误的解决方式
    spring Aop实现防止重复提交
  • 原文地址:https://www.cnblogs.com/leejuen/p/5547440.html
Copyright © 2011-2022 走看看