咱們在利用cocos2dx來開發遊戲時,在開始時就不可避免的會遇到屏幕適配問題,來使咱們的遊戲適應移動終端的各類分辨率大小。目前,你們採用的屏幕適配方案不一,網上的資料也比較豐富,下面我也將本身使用的方案作下記錄。因爲個人Mac系統下只有一個分辨率的虛擬機,因此此次使用的是VS2010,使用的是cocos2dx2.2.2版本。數組
我這裏採用的方案是爲不一樣分辨率的屏幕設置不一樣資源目錄的方案,根據咱們的需求須要準備多套資源,可是因爲部分分辨率較爲接近,因此也沒必要爲全部分辨率都去單獨準備資源,能夠幾種分辨率公用同一套圖片。app
首先,咱們知道cocos2dx默認的資源目錄是Resources目錄,圖片和聲音文件都放在該目錄下。如今,咱們在Resources目錄下建立兩個文件夾「240X320」和「320X480」,目錄下分別放入兩張同名圖片,這樣咱們的素材就準備好了。測試
而後,咱們就能夠在項目中使用不一樣目錄下的素材了。咱們在「AppDelegate.cpp」中添加屏幕適配的方法,代碼以下:this
1 //屏幕適配策略 2 void AppDelegate::ScreenAdaptive() 3 { 4 CCSize szFrame = CCEGLView::sharedOpenGLView()->getFrameSize(); //屏幕真實分辨率大小 5 float whProportion = szFrame.width/szFrame.height; //屏幕寬高比 6 7 const int DIRCOUNT = 2; //資源目錄數量 8 float diff[DIRCOUNT] = {fabs(whProportion-(240.0/320)), fabs(whProportion-(320.0/480))}; //各目錄與屏幕寬高比之差 9 10 int selectIndex = 0; //選擇索引號 11 float minVal = diff[0]; //最小偏差 12 13 //遍歷數組,查找與屏幕寬高比最接近的資源目錄 14 for (int i = 1; i < DIRCOUNT; i++) 15 { 16 if (diff[i] < minVal) 17 { 18 minVal = diff[i]; 19 selectIndex = i; 20 } 21 } 22 23 //設置最佳資源目錄 24 switch(selectIndex) 25 { 26 case 0: 27 { 28 std::vector<std::string> searchPaths; 29 searchPaths.push_back("240X320"); 30 CCFileUtils::sharedFileUtils()->setSearchPaths(searchPaths); //設置資源目錄 31 CCEGLView::sharedOpenGLView()->setDesignResolutionSize(240,320, kResolutionExactFit); //設置設計區域大小及適配方式,此處採用「徹底適應」方式 32 break; 33 } 34 case 1: 35 { 36 std::vector<std::string> searchPaths; 37 searchPaths.push_back("320X480"); 38 CCFileUtils::sharedFileUtils()->setSearchPaths(searchPaths); 39 CCEGLView::sharedOpenGLView()->setDesignResolutionSize(320,480, kResolutionExactFit); 40 break; 41 } 42 default: 43 { 44 break; 45 } 46 } 47 }
該方法的主要思路是,從咱們準備的分辨率資源目錄中查找到與實際屏幕分辨率的寬高比最爲接近的一個目錄,而後將該目錄添加到項目的資源目錄容器中。而後因爲一套資源多是給幾種分辨率公用的,資源不能徹底匹配,因此將適配方式設置爲「徹底適應」及「kResolutionExactFit」,該適配方式會將資源自動拉伸爲屏幕的比例(此處就不介紹其餘幾種適配方式了)。spa
添加此方法後,在「applicationDidFinishLaunching()」方法中調用就能夠了,咱們將此方法放在加載資源以前調用便可。如今,咱們來作下測試,在「HelloWorld」場景的「init()」方法中建立精靈:設計
1 CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize(); 2 CCSprite* pSprite = CCSprite::create("nba.jpg"); 3 pSprite->setPosition(ccp(visibleSize.width/2, visibleSize.height/2)); 4 this->addChild(pSprite, 0);
而後,修改屏幕分辨率。修改方法是,在項目中找到「win32」目錄,打開「main.cpp」文件,代碼量不多,直接修改「eglView->setFrameSize(320, 480);」爲咱們須要的分辨率便可。咱們將分辨率修改成「320,480」和「240,320」,運行程序後獲得以下結果:code
兩次運行結果中,窗體上方顯示出了各自的分辨率,加載的資源分別爲對應目錄下的圖片。這兩個分辨率是徹底匹配的狀況,可是上面咱們也說過,可能有不能徹底匹配的狀況,那麼結果會如何呢?如今,咱們將分辨率改成「480,600」,運行程序後獲得以下結果:blog
根據咱們上面採用的方法,「480,600」的寬高比在「320,480」和「240,320」中與「240,320」更爲接近,因此使用的資源目錄爲「240X320」,而且資源比例被自動拉伸以適應屏幕大小。結果與咱們預想的相同。索引
在實際應用中爲每種分辨率單獨製做資源的工做量很是大,而資源數量太少又會致使圖片拉伸後比例失調影響視覺感覺,因此根據咱們項目的需求,須要幾套資源視狀況而定。遊戲