demibug

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            24 Posts :: 3 Stories :: 2 Comments :: 0 Trackbacks

          我使用的版本是cocos2d-2.0-x-2.0.4,cocos2dx-2.0版本對多分辨率適配提供了很好的支持,使用起來比1.0版本要簡單些,1.0版本的適配可以參考這篇博文
          1. 做2.0版本的適配首先需要了解下面這些知識。
          (1)適配策略
          2.0版本提供了三種適配策略:
          kResolutionNoBorder:超出屏幕的部分會被裁剪,兩側沒有黑邊,鋪滿屏幕,按圖片原始比例顯示,圖片不變形。
          kResolutionShowAll:整個游戲界面是可見的,會按原始比例進行縮放,圖片不變形,但兩側可能會留有黑邊,不鋪滿屏幕。
          kResolutionExactFit:整個游戲界面是可見的,圖片可能會進行拉伸或者壓縮處理,鋪滿屏幕,圖片會變形。
          可以根據自己的要求選擇。
          (2)VisibleSize和VisibleOrigin
          getVisibleSize:表示獲得視口(可視區域)的大小,如果DesignResolutionSize跟屏幕尺寸一樣大,則getVisibleSize等于getWinSize。
          getVisibleOrigin:表示可視區域的起點坐標,這在處理相對位置的時候非常有用,確保節點在不同分辨率下的位置一致。
          (3)DesignResolutionSize
          DesignResolutionSize是一個比較重要的概念,其實2.0版本的適配跟1.0版本原理差不多,都是按比例進行縮放。這個DesignResolutionSize表示設計方案,就是你的游戲完美支持的分辨率方案,一般根據圖片資源的尺寸來定,自適配時會按照這個分辨率計算出縮放因子。因此,這個值也應該是動態的,如果是橫屏游戲則高度肯定是鋪滿屏幕的,寬度也要盡可能的鋪滿屏幕,因此應該選擇寬高比最大的作為設計分辨率,下面的demo會給出使用方法。
          (4)設置相對位置
          在游戲中使用相對位置設置坐標的好處是顯而易見的,這樣就不需要為每個分辨率都定義一套坐標了。首先得定義一些參考點,引擎的TestCpp例子中就提供了一種方法,以屏幕上可視區域的9個點作為參考點,相當于在該矩形內寫一個米字,這9個點分別是:左上、左、左下、下、右下、右、右上、上、中心。

          2. 下面來實現一個簡單的demo,首先創建一個win32工程,這個就不詳述了。
          (1)創建一個AppMacros.h文件,定義了一些宏,源碼如下:

          1. #ifndef __APPMACROS_H__  
          2. #define __APPMACROS_H__  
          3.    
          4. #include "cocos2d.h"  
          5.    
          6. typedef struct tagResource  
          7. {  
          8.     cocos2d::CCSize size;  
          9.     char directory[100];  
          10. }Resource;  
          11.    
          12. //可用的資源尺寸  
          13. static Resource smallResource  =  { cocos2d::CCSizeMake(480, 320),   "iphone" };  
          14. static Resource mediumResource =  { cocos2d::CCSizeMake(1024, 768),  "ipad"   };  
          15. static Resource largeResource  =  { cocos2d::CCSizeMake(2048, 1536), "ipadhd" };  
          16.    
          17. //設計方案  
          18. static cocos2d::CCSize smallDesignResolutionSize = cocos2d::CCSizeMake(480.0f, 320.0f);  
          19. static cocos2d::CCSize mediumDesignResolutionSize = cocos2d::CCSizeMake(1024.0f, 768.0f);  
          20. static cocos2d::CCSize largeDesignResolutionSize = cocos2d::CCSizeMake(2048.0f, 1536.0f);  
          21.    
          22. //縮放因子,主要給文字標簽使用  
          23. #define SCALE_FACTOR  (cocos2d::CCEGLView::sharedOpenGLView()->getDesignResolutionSize().width / smallResource.size.width)  
          24.    
          25. #endif  
          (2)接下來修改AppDelegate.cpp文件的applicationDidFinishLaunching函數,添加以下代碼:

          1. bool AppDelegate::applicationDidFinishLaunching()  
          2. {  
          3.     // initialize director  
          4.     CCDirector *pDirector = CCDirector::sharedDirector();  
          5.     CCEGLView *pEGLView = CCEGLView::sharedOpenGLView();  
          6.     pDirector->setOpenGLView(pEGLView);  
          7.    
          8.     CCSize frameSize = pEGLView->getFrameSize();  
          9.     float ratio = frameSize.width / frameSize.height;  
          10.     float ratio1 = largeDesignResolutionSize.width / largeDesignResolutionSize.height;  
          11.     float ratio2 = mediumDesignResolutionSize.width / mediumDesignResolutionSize.height;  
          12.     float ratio3 = smallDesignResolutionSize.width / smallDesignResolutionSize.height;  
          13.     float d1 = abs(ratio - ratio1);  
          14.     float d2 = abs(ratio - ratio2);  
          15.     float d3 = abs(ratio - ratio3);  
          16.     std::map<float, CCSize> designSize;  
          17.     designSize[d1] = largeDesignResolutionSize;  
          18.     designSize[d2] = mediumDesignResolutionSize;  
          19.     designSize[d3] = smallDesignResolutionSize;  
          20.     std::map<float, CCSize>::reverse_iterator iter = designSize.rbegin();  
          21.     //得到key最大的,因此我這里是橫屏,所以以高度為基準,為了確保縮放后寬度能全屏,所以選取寬高比最大的為設計方案  
          22.     CCSize designResolutionSize = iter->second;  
          23.    
          24.     //pEGLView->setDesignResolutionSize(designResolutionSize.width, designResolutionSize.height, kResolutionNoBorder);  
          25.     pEGLView->setDesignResolutionSize(designResolutionSize.width, designResolutionSize.height, kResolutionShowAll);  
          26.     //pEGLView->setDesignResolutionSize(designResolutionSize.width, designResolutionSize.height, kResolutionExactFit);  
          27.    
          28.     if (frameSize.height > mediumResource.size.height)  
          29.     {   
          30.         CCFileUtils::sharedFileUtils()->setResourceDirectory(largeResource.directory);  
          31.         pDirector->setContentScaleFactor(largeResource.size.height/designResolutionSize.height);  
          32.     }  
          33.     else if (frameSize.height > smallResource.size.height)  
          34.     {   
          35.         CCFileUtils::sharedFileUtils()->setResourceDirectory(mediumResource.directory);  
          36.         pDirector->setContentScaleFactor(mediumResource.size.height/designResolutionSize.height);  
          37.     }  
          38.     else  
          39.     {   
          40.         CCFileUtils::sharedFileUtils()->setResourceDirectory(smallResource.directory);  
          41.         pDirector->setContentScaleFactor(smallResource.size.height/designResolutionSize.height);  
          42.     }  
          43.    
          44.     pDirector->setDisplayStats(true);  
          45.    
          46.     pDirector->setAnimationInterval(1.0 / 60);  
          47.    
          48.     CCScene *pScene = HelloWorld::scene();  
          49.    
          50.     pDirector->runWithScene(pScene);  
          51.    
          52.     return true;  
          53. }  

          (3)創建VisibleRect.h和VisibleRect.cpp文件,封裝了獲取那9個點坐標的函數,比較簡單。代碼如下:
          VisibleRect.h

          1. #ifndef __VISIBLERECT_H__  
          2. #define __VISIBLERECT_H__  
          3.    
          4. #include "cocos2d.h"  
          5. USING_NS_CC;  
          6.    
          7. class VisibleRect  
          8. {  
          9. public:  
          10.     static CCRect getVisibleRect();  
          11.    
          12.     static CCPoint left();  
          13.     static CCPoint right();  
          14.     static CCPoint top();  
          15.     static CCPoint bottom();  
          16.     static CCPoint center();  
          17.     static CCPoint leftTop();  
          18.     static CCPoint rightTop();  
          19.     static CCPoint leftBottom();  
          20.     static CCPoint rightBottom();  
          21. private:  
          22.     static void lazyInit();  
          23.     static CCRect s_visibleRect;  
          24. };  
          25.    
          26. #endif  

          VisibleRect.cpp

          1. #include "VisibleRect.h"  
          2.    
          3. CCRect VisibleRect::s_visibleRect;  
          4.    
          5. void VisibleRect::lazyInit()  
          6. {  
          7.     if (s_visibleRect.size.width == 0.0f && s_visibleRect.size.height == 0.0f)  
          8.     {  
          9.         CCEGLView* pEGLView = CCEGLView::sharedOpenGLView();  
          10.         s_visibleRect.origin = pEGLView->getVisibleOrigin();  
          11.         s_visibleRect.size = pEGLView->getVisibleSize();  
          12.     }  
          13. }  
          14.    
          15. CCRect VisibleRect::getVisibleRect()  
          16. {  
          17.     lazyInit();  
          18.     return CCRectMake(s_visibleRect.origin.x, s_visibleRect.origin.y, s_visibleRect.size.width, s_visibleRect.size.height);  
          19. }  
          20.    
          21. CCPoint VisibleRect::left()  
          22. {  
          23.     lazyInit();  
          24.     return ccp(s_visibleRect.origin.x, s_visibleRect.origin.y + s_visibleRect.size.height/2);  
          25. }  
          26.    
          27. CCPoint VisibleRect::right()  
          28. {  
          29.     lazyInit();  
          30.     return ccp(s_visibleRect.origin.x+s_visibleRect.size.width, s_visibleRect.origin.y + s_visibleRect.size.height/2);  
          31. }  
          32.    
          33. CCPoint VisibleRect::top()  
          34. {  
          35.     lazyInit();  
          36.     return ccp(s_visibleRect.origin.x + s_visibleRect.size.width/2, s_visibleRect.origin.y + s_visibleRect.size.height);  
          37. }  
          38.    
          39. CCPoint VisibleRect::bottom()  
          40. {  
          41.     lazyInit();  
          42.     return ccp(s_visibleRect.origin.x + s_visibleRect.size.width/2, s_visibleRect.origin.y);  
          43. }  
          44.    
          45. CCPoint VisibleRect::center()  
          46. {  
          47.     lazyInit();  
          48.     return ccp(s_visibleRect.origin.x + s_visibleRect.size.width/2, s_visibleRect.origin.y + s_visibleRect.size.height/2);  
          49. }  
          50.    
          51. CCPoint VisibleRect::leftTop()  
          52. {  
          53.     lazyInit();  
          54.     return ccp(s_visibleRect.origin.x, s_visibleRect.origin.y + s_visibleRect.size.height);  
          55. }  
          56.    
          57. CCPoint VisibleRect::rightTop()  
          58. {  
          59.     lazyInit();  
          60.     return ccp(s_visibleRect.origin.x + s_visibleRect.size.width, s_visibleRect.origin.y + s_visibleRect.size.height);  
          61. }  
          62.    
          63. CCPoint VisibleRect::leftBottom()  
          64. {  
          65.     lazyInit();  
          66.     return s_visibleRect.origin;  
          67. }  
          68.    
          69. CCPoint VisibleRect::rightBottom()  
          70. {  
          71.     lazyInit();  
          72.     return ccp(s_visibleRect.origin.x + s_visibleRect.size.width, s_visibleRect.origin.y);  
          73. }  
          (4)修改HelloWorldScene.cpp的init函數,使用相對位置設置坐標。

          1. bool HelloWorld::init()  
          2. {  
          3.     if ( !CCLayer::init() )  
          4.     {  
          5.         return false;  
          6.     }  
          7.     CCMenuItemImage *pCloseItem = CCMenuItemImage::create(  
          8.                                         "CloseNormal.png",  
          9.                                         "CloseSelected.png",  
          10.                                         this,  
          11.                                         menu_selector(HelloWorld::menuCloseCallback));  
          12.    
          13.     pCloseItem->setPosition(ccpAdd(VisibleRect::rightBottom(),   
          14.                                 ccp(-pCloseItem->getContentSize().width/2, pCloseItem->getContentSize().height/2)));  
          15.    
          16.     CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);  
          17.     pMenu->setPosition(CCPointZero);  
          18.     this->addChild(pMenu, 1);  
          19.    
          20.     CCLabelTTF* pLabel = CCLabelTTF::create("Hello World", "Arial", SCALE_FACTOR * 24);  
          21.     pLabel->setPosition(ccpAdd(VisibleRect::top(),  
          22.                             ccp(0, -pLabel->getContentSize().height)));  
          23.     this->addChild(pLabel, 1);  
          24.    
          25.     CCSprite* pSprite = CCSprite::create("HelloWorld.png");  
          26.     pSprite->setPosition(VisibleRect::center());  
          27.     this->addChild(pSprite, 0);  
          28.    
          29.     CCSprite *pLogoSprite = CCSprite::create("icon.png");  
          30.     pLogoSprite->setAnchorPoint( ccp(0, 0.5) );  
          31.     pLogoSprite->setPosition(ccpAdd(VisibleRect::left(), ccp(50, 0)));  
          32.     this->addChild(pLogoSprite, 0);  
          33.    
          34.     return true;  
          35. }  

          (5)創建窗口,main.cpp的主要內容:

          1. AppDelegate app;  
          2. CCEGLView* eglView = CCEGLView::sharedOpenGLView();  
          3.     //eglView->setFrameSize(2048, 1536);  
          4.     //eglView->setFrameSize(480, 320);  
          5.     //eglView->setFrameSize(800, 480);  
          6.     //eglView->setFrameSize(1024, 768);  
          7.     //eglView->setFrameSize(1280, 800);  
          8.     eglView->setFrameSize(1280, 768);  
          9.     //eglView->setFrameSize(960, 640);  
          10.     eglView->setFrameZoomFactor(0.5f);  
          11.    
          12. int ret = CCApplication::sharedApplication()->run();  
          OK,到此為止,代碼部分已經完成了,下面看看在各種分辨率和不同策略下的效果圖:
          1. kResolutionShowAll策略
          (1)2048×1536



          (2)1024×768


          (3)480×320


          2. kResolutionExactFit策略
          1280×768分辨率


          3. kResolutionNoBorder策略
          1280×768分辨率

          demo源碼:http://download.csdn.net/detail/zhoujianghai/4847206

          本文鏈接:http://codingnow.cn/cocos2d-x/975.html

          posted on 2013-03-13 01:25 Hiji 閱讀(6948) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 麟游县| 井研县| 拜泉县| 和静县| 崇仁县| 南丹县| 剑阁县| 绥棱县| 洛扎县| 慈溪市| 哈巴河县| 新民市| 乌审旗| 年辖:市辖区| 仙桃市| 武清区| 都江堰市| 青铜峡市| 台安县| 泰宁县| 和田县| 玛多县| 历史| 东丽区| 仁寿县| 龙川县| 玉环县| 石首市| 确山县| 济宁市| 安阳县| 怀来县| 阿克苏市| 黄大仙区| 修武县| 九龙城区| 尼勒克县| 池州市| 巴南区| 资中县| 芒康县|