【cocos2d-x 手游研發小技巧(3)Android界面分辨率適配方案】


先感嘆一下吧~~android的各種分辨率各種適配虐我千百遍,每次新項目我依舊待它如初戀····

每家公司都有自己項目工程適配的方案,這種東西就是沒有最好,只有最適合!!!

這次新項目專項針對android,目的性強,適配方案我覺得2套圖去兼容android各種分辨率;

我們先了解一下android手機上的屏幕密度:

Android主要有以下幾種屏:

QVGA和WQVGA屏density=120;

HVGA屏density=160;

WVGA屏density=240....更多 density值表示每英寸有多少個顯示點;

和分辨率不一樣,大部分做應用的就可以通過屏幕密度走,那么游戲中也可以類似走這種路線;

但是現在的出現了超高清屏幕,諸如小米,三星稍微比較高端一點新出的機型分辨率都非常之高達到FHD;

FHD級別就是我們所謂的屏幕像素達到了1920*1080P格式,也就是全高清屏幕的簡稱了,要適應這種屏幕得單獨適配;

廢話不多了就直接上解決方案吧:

思路1:背景適配,然后往背景里面add部分UI原件的方法。先解決背景適配;
思路2:根據屏幕尺寸,去適應“屏幕窗口UI原件”,不屬於任何原件直接Add到CClayer中的;

代碼如下:

先建立一個VisibleRect類去通過CCEGLView拿到屏幕尺寸,然后再取八個點作為靜態方法以后直接當做目標定位使用

#ifndef __VISIBLERECT_H__
#define __VISIBLERECT_H__

#include "cocos2d.h"
USING_NS_CC;

class VisibleRect
{
public:
    static CCRect getVisibleRect();

    static CCPoint left();
    static CCPoint right();
    static CCPoint top();
    static CCPoint bottom();
    static CCPoint center();
    static CCPoint leftTop();
    static CCPoint rightTop();
    static CCPoint leftBottom();
    static CCPoint rightBottom();
private:
    static void lazyInit();
    static CCRect s_visibleRect;
};

#endif /* __VISIBLERECT_H__ */

VisibleRect.cpp

#include "VisibleRect.h"

CCRect VisibleRect::s_visibleRect;

void VisibleRect::lazyInit()
{
    if (s_visibleRect.size.width == 0.0f && s_visibleRect.size.height == 0.0f)
    {
        CCEGLView* pEGLView = CCEGLView::sharedOpenGLView();
        s_visibleRect.origin = pEGLView->getVisibleOrigin();
        s_visibleRect.size = pEGLView->getVisibleSize();
    }
}

CCRect VisibleRect::getVisibleRect()
{
    lazyInit();
    return CCRectMake(s_visibleRect.origin.x, s_visibleRect.origin.y, s_visibleRect.size.width, s_visibleRect.size.height);
}

CCPoint VisibleRect::left()
{
    lazyInit();
    return ccp(s_visibleRect.origin.x, s_visibleRect.origin.y+s_visibleRect.size.height/2);
}

CCPoint VisibleRect::right()
{
    lazyInit();
    return ccp(s_visibleRect.origin.x+s_visibleRect.size.width, s_visibleRect.origin.y+s_visibleRect.size.height/2);
}

CCPoint VisibleRect::top()
{
    lazyInit();
    return ccp(s_visibleRect.origin.x+s_visibleRect.size.width/2, s_visibleRect.origin.y+s_visibleRect.size.height);
}

CCPoint VisibleRect::bottom()
{
    lazyInit();
    return ccp(s_visibleRect.origin.x+s_visibleRect.size.width/2, s_visibleRect.origin.y);
}

CCPoint VisibleRect::center()
{
    lazyInit();
    return ccp(s_visibleRect.origin.x+s_visibleRect.size.width/2, s_visibleRect.origin.y+s_visibleRect.size.height/2);
}

CCPoint VisibleRect::leftTop()
{
    lazyInit();
    return ccp(s_visibleRect.origin.x, s_visibleRect.origin.y+s_visibleRect.size.height);
}

CCPoint VisibleRect::rightTop()
{
    lazyInit();
    return ccp(s_visibleRect.origin.x+s_visibleRect.size.width, s_visibleRect.origin.y+s_visibleRect.size.height);
}

CCPoint VisibleRect::leftBottom()
{
    lazyInit();
    return s_visibleRect.origin;
}

CCPoint VisibleRect::rightBottom()
{
    lazyInit();
    return ccp(s_visibleRect.origin.x+s_visibleRect.size.width, s_visibleRect.origin.y);
}

有了這個工具類可以做很多事情了;

下面我們需要去適配背景,具體方法如下:

CCSprite* PublicShowUI::setTagScale(CCSprite* tagSprite)
{
    float last_X,last_Y;
    float X2 = tagSprite->getContentSize().width;
    float Y2 = tagSprite->getContentSize().height;
    last_X = ( (float)VisibleRect::getVisibleRect().size.width/X2) ;
    last_Y = ( (float)VisibleRect::getVisibleRect().size.height/Y2);
    tagSprite->setScaleX(last_X);
    tagSprite->setScaleY(last_Y);
    return tagSprite;
    
}

要適應各種大小分辨率,一套圖是不夠用的,根據自己項目的需要去制作2套圖,我推薦的是如下分辨率套圖:

800*480 一套

1136*640 二套

HD高清 第三套 1920 * 1080 目前手機上面比較高的,據說三星的超過2000,可以自己去設定!

有了這些圖,分別整理自己的資源文件夾然后去適配,代碼如下:

/******************
 *獲取屏幕分辨率
 *根據分辨率計算使用哪一套資源
 ******************/
int PublicShowUI::getinch(void)
{
    int lastinch = -1;
    CCSize winSizeInPixels = screenSize;
    if(winSizeInPixels.width>=800&&winSizeInPixels.width<=960)
    {
        lastinch = INCH_1;//ihpone3.5寸
    }
    else if(winSizeInPixels.width>960&&winSizeInPixels.width<=1136)
    {
        lastinch = INCH_2;//ihpone4寸及大部分android4寸左右屏幕
    }
    else if(winSizeInPixels.width>1136&&winSizeInPixels.width<=1920)
    {
        lastinch = INCH_MAX;//超高清屏幕
    }
    else
    {
        lastinch = INCH_2;
    }
    return lastinch;
}


/******************
 *根據自定義圖片路徑去取不同套圖的路徑
 *imgres 格式:imgdir%d/imgname.png
 ******************/
CCString* PublicShowUI::getResImgPath(char* imgres)
{
    sprintf(str, imgres ,getinch());
    return CCString::create(str);
}

獲取屏幕分辨率screenSize

CCEGLView* pEGLView = CCEGLView::sharedOpenGLView();
pDirector->setOpenGLView(pEGLView);
CCSize screenSize = pEGLView->getFrameSize();

 

使用:

view_Room = new View_Room(this, PublicShowUI::getResImgPath(IMG_ROOM_BACKGROUND), 1, VisibleRect::center());

背景圖一定要居中顯示:

VisibleRect::center()

OK以上便是我適配的方案和思路;

下面我上2張IOS模擬器上的圖,我故意再背景圖的邊框加了綠線,來顯示區別顯示全屏,然后用了兩套圖去適配!

3.5寸IOS的分辨率如下: 

 

4寸分辨率如下:

 

 


免責聲明!

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



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