Cocos2d-x深度分析適配方法之kResolutionNoBorder的座標關係


本菜鳥接觸Cocos2d-x時間不久,我只是當做愛好來學習,所以拙劣之章,不喜勿噴。

適配方法有以下三種,這裏我只分析一下第三種

(1)kResolutionExactFit

(2)kResolutionShowAll 

(3)kResolutionNoBorder

自行提前百度瞭解什麼是分辨率

在AppDelegate.cpp下有以下代碼,這是hallow word的原代碼

 if(!glview) {
        glview = GLView::create("My Game");
        director->setOpenGLView(glview);
    }

這是適配後的代碼

If(!glview)

{

  glview=GLView::createWithRect(“MY  GAME”,Rect(0,0,480,640));

  director->setOpenGLView(glview);

  glview->setDesignResolutionSize(480,320 ,kResolutionNoBorder );

}


(1) glview=GLView::createWithRect(“MY  GAME”,Rect(0,0,480,640));

創建一個名爲MY GAME且寬和高尺寸分別爲480640win32窗口,其實就是將來的手機屏幕大小。

(2) glview->setDesignResolutionSize(480,320 ,kResolutionNoBorder );

設置分辨率,kResolutionNoBorder是你設置的分辨率爲適配顯示器屏幕大小尺寸的一種方法,即指以480,320的分辨率適應480640的屏幕大小。適應方法是寬和高等比放大或縮小,由給出的分辨率可知分辨率寬480正好1:1適配屏幕寬480,但分辨率高320卻是1:2沒有適配屏幕高640,也就是說在屏幕高640的尺寸大小上有320個像素點,而在屏幕寬480的尺寸大小上有480個像素點,這顯然是不符合kResolutionNoBorder這種適配方法的規定(寬高等比放大或縮小), 

有兩種伸縮方案如下:

(1)屏幕寬和給出的寬像素點的比例不變

按照屏幕寬4801:1的比例適配480個像素點,那麼剩下的就應該讓屏幕高6401:1的比例適配640個像素點,

但問題是在現在系統只給了320個像素點,沒法額外增加像素點,所以這種適配方法pass,這時你會這麼想:當時要是多定義幾個像素點該多好啊,我想用多少就從中拿出多少像素點,就不會出現像素點不夠屏幕尺寸分配的情況了,所以就誕生了下面的適配方法。

(2)屏幕高和給出的高像素點的比例不變

如上所述,屏幕高尺寸620上按比例2:1分配320個像素點,相應的屏幕寬480上按比例2:1應該分配240個像素點,這就滿足了kResolutionNoBorder這種適配方法的規定(寬高等比放大或縮小),即比例都是2:1 。而實際系統給了480個像素點,這時我們只需從中拿出我們需要的240個像素點就行了,其他的像素點你不用管,讓它們留在屏幕寬外邊就行了。

所以接踵而至的問題又來了,

這時,屏幕的原點(左下角)座標(0,0)與適配後的分辨率原點座標也已不是一一對應的關係了,並且屏幕的寬高尺寸和分辨率的寬高尺寸也不是一一對應了,所以這時需要調用以下函數來獲取上述值

 以下是獲取相應的值得代碼

Size  visibleSize  = Director::getInstance()->getVisibleSize();

//通過獲得在win32窗口的長寬尺寸大小下適配的相應的像素點數目,從而得到適配後的顯示在窗口中的寬高尺寸大小

Vec2  origin      = Director::getInstance()->getVisibleOrigin()

//得到屏幕原點(左下角)的座標

以下是經測試得到的數據

visibleSize.width=240      visibleSize.height=320

origin.x=120                       origin .y=0

注意這裏,我並沒有添加任何背景圖層,所以win32窗口尺寸大小適配分辨率尺寸大小後的關係是看不到的。下圖是自己做的尺寸大小關係圖


如圖 黑框部分是win32窗口(480,640),紅框是適配分辨率後的窗口(480,320)但其實你是看不到黑框以外的那一部分的,這裏爲了能更好的理解他們之間的關係,所以我就把沒有顯示的那一部分也畫出來了。

上圖中關係是:黑框的寬(尺寸)480對應240個像素點,黑框的高(尺寸)640對應320個像素點。

黑框左下角的座標爲(120,0),右上角座標(360,320)

紅框左下角的座標(0,0),   右上角座標(480,320)(紅框的這兩個座標你是看不到的)

這裏就可以看出來,所有的座標與win32窗口的尺寸大小沒有任何關係了,更確切的說與將來手機的屏幕大小沒有關係了,即達到了適配效果。

還有,你接下的所有操作都是建立在適配的座標下,與win32窗口(480,640)尺寸大小沒有任何聯繫。比如隨便找個座標(240,320),你猜這個座標的位置在哪?

還是你以爲的窗口正中間嗎?顯然不是。他在黑框的上邊框的中間。

到這兒,你就可以推算出其他兩種適配方法的座標關係了。

新手才淺,哪兒說的不對,往指導。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章