cocos2d-x屏幕適配

第一,對於屏幕適配問題,首先必須理解幾個基本的概念。


FrameSize:實 際上就是設備的原始分辨率,開發環境中可以通過CCEGLView::sharedOpenGLView()->setFrameSize()來設 置設備的分辨率大小,當然也可以可以通過CCEGLView::sharedOpenGLView()->getFrameSize()獲取得到設 備的分辨率

 

WinSize:開發所設計的分辨率,即setDesignResolutionSize方法中傳入的前兩個參數,通過CCDirector::sharedDirector()->getWinSize()獲取

 

VisibleSize:一定小於等於WinSize,即在WinSize範圍之內,保持FrameSize寬高比的最大顯示區域。

 

VisibleOrigin:在WinSize下被FrameSize截取的區域大小,即設計分辨率中與屏幕左下角對應的點。

 

第二,cocos2d-x自帶的三種適配方案


這裏我們將設備的分辨率改爲768*1024,開發設計的分辨率爲640*960,背景圖爲大小爲640*960,在屏幕居中顯示,cocos2d-x默認的適配方案得到的效果:


blob.png


可以看出由於沒有采用合理的適配方法,圖像會根據我們設置的位置顯示大小,如果圖像本身比設備分辨率大,則只顯示設備分辨率大小的圖像,反之則會留有空餘處,如上圖的黑邊。如我們採用下面三種基本的適配方案又會得到不同的效果

 

kResolutionExactFit:通過拉伸來填滿屏幕,寬高比不同,圖片無法等比縮放來填充屏幕,圖片會扭曲變形,如圖中間的人物原先是正方形的,現在變成了長方形,界面稍複雜,就會看見明顯的不協調,這種方式通常不可取。


blob.png



kResolutionNoBorder:無黑邊,寬高等比縮放,但縮放的比例按照寬比和高比中大的來進行。這樣出現的結果可能就是有圖片的一部分會顯示在屏幕的外面。


blob.png



kResolutionShowAll:全 部顯示,保證內容在屏幕內顯示,同樣是寬高等比縮放,但縮放比例取小的進行。按這種方式適配可能會在屏幕上出現黑邊,如果打算在黑邊出填放別的精靈是無效 的,因爲等比縮放後,黑邊的部分不會進行繪製。假如設計分辨率低於大部分設備分辨率,在忽略黑邊的情況下,這種適配方式可以滿足大部分設備,而我們後面改 進的適配方案就是把留出來的黑邊利用上


blob.png


以 上三種適配方式雖然能在一定問題上能解決適配的問題,不過對於現今各式各樣、衆多分辨率的設備來說,想要一套資源適配所有設備而不做資源的更改是不可能 的,這點必須明白。沒有一種完美的適配方案,而我們所做的不過是儘量更完善,那如何找到一種行之有效的適配方案呢?在保持圖像基本不變形的情況下我們可以 對第二種,第三種適配方案進行改進。

 

根據設備分辨率改變WinSize的大小:



由這個思路,假如我們預設WinSize爲(640,960),先計算設備分辨率和設計分辨率的寬比與高比

float scaleX=frameSize.width/designSize.width;

float scaleY=frameSize.height/designSize.height;

在 第三種方案基礎上進行改進,依舊選擇寬高比小的進行縮放,這裏選擇scaleY,由於第三種方案會產生黑邊,而我們又無法利用黑邊,所以改進的方案就是把 黑邊利用上,那如何利用上呢?前面說過,黑邊是由於寬高比例不同造成的,這樣我們可以反過來思考,讓設備分辨率和設計分辨率寬高比一致。所以在這種前提 下,我們得到了一種解決辦法,假設設備兩者的寬高比一致的情況下,WinSize的寬高爲多少才合適,在本例中我們需要算出WinSize的寬,計算方法 如下:

frameSize.width/scaleY;

將計算出來的寬和我們預設的設計分辨率的高作爲傳入的WinSize的值,這樣我們就能把黑邊利用上了

pEGLView->setDesignResolutionSize(frameSize.width/scaleY,designSize.height,kResolutionShowAll);


blob.png



但運行的結果和kResolutionShowAll似乎一樣,這是因爲黑邊我們雖然已經可以利用了,但沒有顯示效果,這裏我們現在已經可以對黑邊進行填充了,效果如下:


blob.png

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