1. 程式人生 > >cocos2d-x 3 0 解析度自適應方案

cocos2d-x 3 0 解析度自適應方案

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

1. 簡介

    對於cocos2dx的解析度方案原來一知半解,終於今天有機會給搞清楚了。在cocos2d-x中的幾種解析度:

1.1 Framebuffer解析度(其大小依賴於硬體裝置)

          儲存在EGLViewProtocol類的Size _screenSize;

          在nativeactivity.cpp的cocos_init中呼叫setFrameSize設定Framebuffer大小,Framebuffer大小在engine_init_display中呼叫以下程式碼獲取:     

    EGLint w, h;    eglQuerySurface(display, surface, EGL_WIDTH, &w);    eglQuerySurface(display, surface, EGL_HEIGHT, &h);

              

           獲取方式:

           EGLView::getInstance()->getFrameSize();

      

1.2 設計解析度(其大小依賴於遊戲設計人員,與硬體裝置無關)

          遊戲UI設計人員或程式人員都是基於此尺寸進行設計。

          獲取方式:

          (1)遊戲設計視窗大小:Director::getInstance()->getVisibleSize(); //實際從EGLView中獲取

          (2)遊戲設計視窗原點:Director::getInstance()->getVisibleOrigin(); //實際從EGView中獲取

2. 解析度自適應

    解析度自適應:即把設計好的遊戲以全屏方式(但背景圖片不一定能全部顯示出來)顯示在目標裝置上,以給使用者最好的體驗。

    可以通過EGLView::getInstance()->setDesignResolutionSize(float width, float height, ResolutionPolicy resolutionPolicy)來告訴cocos2d-x 3.0遊戲設計解析度,然後cocos2d-x 3.0將自動根據設定的resolutionPolicy進行scale,以實現全屏顯示。

    其參考程式碼及相關log如下所示:

#define DESIGN_WIDTH 1280#define DESIGN_HEIGHT 800bool AppDelegate::applicationDidFinishLaunching() {    // initialize director    auto director = Director::getInstance();    auto eglView = EGLView::getInstance();    director->setOpenGLView(eglView);     // turn on display FPS    director->setDisplayStats(true);    // set FPS. the default value is 1.0/60 if you don't call this    director->setAnimationInterval(1.0 / 60);    // resolution information    Size size;    size= director->getWinSize();    log("***IDONG: Director getWinSize:w=%f,h=%f",size.width,size.height);    size = director->getWinSizeInPixels();    log("***IDONG: Director getWinSizeInPixels:w=%f,h=%f",size.width,size.height);        size = director->getVisibleSize();    log("***IDONG: Director getVisibleSize:w=%f,h=%f",size.width,size.height);    Point point = director->getVisibleOrigin();    log("***IDONG: Director getVisibleOrigin:x=%f,y=%f",point.x,point.y);            log("***IDONG: Director BS: getContentScaleFactor: scaleFactor=%f",director->getContentScaleFactor());    // set design resolution size    eglView->setDesignResolutionSize(DESIGN_WIDTH,DESIGN_HEIGHT,ResolutionPolicy::NO_BORDER);    log("***IDONG:\n");    log("***IDONG: Director AS: getContentScaleFactor: scaleFactor=%f",director->getContentScaleFactor());    size= director->getWinSize();    log("***IDONG: Director getWinSize:w=%f,h=%f",size.width,size.height);    size = director->getWinSizeInPixels();    log("***IDONG: Director getWinSizeInPixels:w=%f,h=%f",size.width,size.height);        size = director->getVisibleSize();    log("***IDONG: Director getVisibleSize:w=%f,h=%f",size.width,size.height);    point = director->getVisibleOrigin();    log("***IDONG: Director getVisibleOrigin:x=%f,y=%f",point.x,point.y);    // create a scene. it's an autorelease object    auto scene = StartLayer::createScene();    // run    director->runWithScene(scene);    return true;}

相關log資訊:

Director getWinSize:w=1920.000000,h=1032.000000Director getWinSizeInPixels:w=1920.000000,h=1032.000000Director getVisibleSize:w=1920.000000,h=1032.000000Director getVisibleOrigin:x=0.000000,y=0.000000Director BS: getContentScaleFactor: scaleFactor=1.000000Director AS: getContentScaleFactor: scaleFactor=1.000000Director getWinSize:w=1280.000000,h=800.000000Director getWinSizeInPixels:w=1280.000000,h=800.000000Director getVisibleSize:w=1280.000000,h=688.000000Director getVisibleOrigin:x=0.000000,y=56.000000

2.1 顯示規則

      1) 遊戲背景畫面不一定能全部顯示,但關鍵部分必須顯示,所以在背景畫面上的四周不要放置重要資訊

      2) 遊戲元素必須全部顯示,且其位置基於Director::getVisibleSize和Director::getVisibleOrigin 來進行放置,如需要把一個sprite放置於螢幕中央,其程式碼可以為:

    Size visibleSize = Director::getInstance()->getVisibleSize();    Point origin = Director::getInstance()->getVisibleOrigin();    //////////////////////////////    // 2. add background    //auto sprite = Sprite::create("map_logo_ocean_001_sx.jpg",Rect(0,168,visibleSize.width,visibleSize.height));    auto sprite = Sprite::create("map_logo_ocean_001_sx.jpg");    // position the sprite on the center of the screen    sprite->setPosition(Point(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));    // add the sprite as a child to this layer    this->addChild(sprite, 0);  

 


           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述