中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

cocos2d-x自制工具09:復活!x2屏幕適配方案

發布時間:2020-06-08 17:01:36 來源:網絡 閱讀:4160 作者:老G 欄目:游戲開發

適配屏幕的方案主要看游戲類型,游戲類型決定了是否需要滾屏。不同的游戲類型,決定了不同屏幕適配方案。


對于市面上大量存在的卡牌,單屏休閑益智類游戲,往往拼的是速度。但是惱人的屏幕適配問題,一直困擾了很多企業。


之前簡單收集了一下市面上的各種分辨率。

480X800  現在最主流的中高端安卓智能機的分辨率,包括 windows phone也是這個分辨率

480X854  這個是WFVGA,是480X800的加長版


540X960  HTC的高端機很喜歡用這個分辨率也就是qHD了

640X960 最經典的iphone所使用的分辨率

1136X640  iphone5的分辨率

1280X720  傳說中的HD,也是現在各品牌主流旗艦機型的分辨率,而且屏幕都很大。

1280X800  現在只有三星的9220的5.3英寸巨屏用了這以分辨率


1024x768    iPad1分辨率 iPad2分辨率 iPad mini分辨率

2048×1536  iPad3分辨率 iPad4分辨率 iPad Air分辨率 iPad mini 2分辨率


1920x1080 Nexus5分辨率


這么多分辨率,很頭痛。這種情況下,我們一般使用的是固定一個分辨率,然后縮放的方式。Cocos2d-x引擎內置了很多這種分辨率適配方案。主要使用這個函數:

void CCEGLViewProtocol::setDesignResolutionSize(float width, float height, ResolutionPolicy resolutionPolicy)


ResolutionPolicy的參數如下:

enum ResolutionPolicy
{
    // The entire application is visible in the specified area without trying to preserve the original aspect ratio.
    // Distortion can occur, and the application may appear stretched or compressed.
    kResolutionExactFit,
    // The entire application fills the specified area, without distortion but possibly with some cropping,
    // while maintaining the original aspect ratio of the application.
    kResolutionNoBorder,
    // The entire application is visible in the specified area without distortion while maintaining the original
    // aspect ratio of the application. Borders can appear on two sides of the application.
    kResolutionShowAll,
    // The application takes the height of the design resolution size and modifies the width of the internal
    // canvas so that it fits the aspect ratio of the device
    // no distortion will occur however you must make sure your application works on different
    // aspect ratios
    kResolutionFixedHeight,
    // The application takes the width of the design resolution size and modifies the height of the internal
    // canvas so that it fits the aspect ratio of the device
    // no distortion will occur however you must make sure your application works on different
    // aspect ratios
    kResolutionFixedWidth,
    kResolutionUnKnown,
};


這些參數的含義,很多文章都分析過了,我們簡單說一下:

kResolutionShowAll

等比例拉伸,直到寬度或高度達到屏幕的尺寸,但是:如果游戲的設計分辨率比率和設備的屏幕分辨率比率不同,最后會出現黑邊。結論:無法使用,黑邊出現不符合很多渠道和應用商店的規范。

kResolutionExactFit

非等比例拉伸,圖像拉伸到整個屏幕。但是:如果游戲的設計分辨率比率和設備的屏幕分辨率比率不同,最后游戲畫面失真。結論:可以使用,但是效果很差。

kResolutionNoBorder

等比例拉伸,直到寬度或高度達到屏幕尺寸,且保證在另一方向上不會出現黑邊。但是,他只是簡單的拉伸處理,對于座標偏移沒有控制,造成最后代碼中要手動計算座標VisibleSize 和 VisibleOrigin,這不符合正常的開發習慣。結論:可以使用,但是座標計算很繁瑣。


由于上面的種種問題,引擎團隊最后又增加了兩個新參數

kResolutionFixedHeight和kResolutionFixedWidth,這兩個參數作用和kResolutionNoBorder類似,但是內部座標經過了處理,不像kResolutionNoBorder那么麻煩。


我們的方案就基于這兩個參數。

該方案的前提與目的:

我們的目標是重建當初的x2的那種適配方式,有兩套資源,一套SD,一套HD。在此基礎上,做到座標系通用,UI資源通用。僅僅是圖片的清晰度不同。這是對于中小團隊來說最快速的適配方案。


下面貼核心代碼,修改AppDelegate::applicationDidFinishLaunching()函數,加上如下代碼:


    CCSize frameSize = pEGLView->getFrameSize();
    if (frameSize.width == 640 && frameSize.height == 960)
    {
        //標準分辨率,不做調整
    }
    else if (frameSize.width == 640 && frameSize.height == 1136)
    {
        //標準分辨率,不做調整
    }
    else
    {
        CCSize winSize;
#ifdef HD_PORT_SCHEME
        if (frameSize.width*frameSize.height>=2073600) {//1080p分辨率
            //HD資源
            winSize=CCSize(1280, 1920);
            pDirector->setContentScaleFactor(2);
        }
        else{
            //SD資源
            winSize=CCSize(640,960);
        }
#else
        //SD資源
        winSize=CCSize(640,960);
#endif
                                                                                                                                                                                                                                                       
        //WHR寬高比 width height ratio
        float winSizeWHR = winSize.width / winSize.height ;
        float frameSizeWHR = frameSize.width / frameSize.height;
                                                                                                                                                                                                                                                       
        if (winSizeWHR > frameSizeWHR)
            pEGLView->setDesignResolutionSize(winSize.width, winSize.height, kResolutionFixedWidth);
        else
            pEGLView->setDesignResolutionSize(winSize.width, winSize.height, kResolutionFixedHeight);
    }



說明:

1.我們以960x640作為標準分辨率

2.以1080p判斷作為基準,來判斷是否啟用HD資源。

3.判斷寬高比,以決定縮放方向

4.HD_PORT_SCHEME宏來決定是否啟用HD適配方案,如果關閉,則全部設備上都是SD資源的低清方案。


其他注意事項:

1.如果啟用HD方案,在高清設備上,場景根節點需要放大setScale(2)

2.如果啟用HD方案,觸摸時的座標點需要處理,經過換算變成960x640下的。好在這種代碼很少在觸摸回調時增加一下即可。

3.理論上,所有的工具輸出的資源都支持這種方式來做適配。也就是說,對于程序,策劃來說只用一套SD資源開發即可。美術先出HD圖,然后縮成SD提供給開發用。


題外話:對于很多復雜的游戲,UI和場景應該是徹底分開來做的,因為這兩個需求不同,清晰度要求和資源提供也可能有很大差別,但是引擎本身似乎沒有考慮這一點。有些分支是做了的,把UI和場景拆成兩個節點,這是不錯的設計。


最后,本來還想做個詳細的例子,但是最新版引擎3.0beta2的工程模板老出問題,新建工程在win8上面始終無法打開,等穩定一下再補吧。







向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

安丘市| 西安市| 平阴县| 冷水江市| 神池县| 大埔区| 福海县| 昌都县| 额敏县| 云梦县| 克山县| 商洛市| 米易县| 霍林郭勒市| 勐海县| 根河市| 沙坪坝区| 盘锦市| 西乡县| 多伦县| 江北区| 聂荣县| 山丹县| 延庆县| 南京市| 南安市| 靖安县| 丰顺县| 会同县| 湛江市| 宜宾县| 滕州市| 伊金霍洛旗| 宜城市| 嘉定区| 句容市| 兴海县| 宝丰县| 海兴县| 苍溪县| 南平市|