cocos2dx3.0五種屏幕適配模式,及FIXED_WIDTH、FIXED_HEIGHT使用

適配模式app

(1)EXACT_FIT   :拉伸變形,使鋪滿屏幕。會出現圖像拉伸函數

屏幕寬 與 設計寬比 做爲X方向的縮放因子,屏幕高 與 設計高比 做爲Y方向的縮放因子。佈局

保證了設計區域徹底鋪滿屏幕,可是可能會出現圖像拉伸。this

(2)NO_BORDER   :按比例放縮,全屏展現不留黑邊。會有超出屏幕區域設計

屏幕寬、高分別和設計分辨率寬、高計算縮放因子,取較(大)者做爲寬、高的縮放因子。圖片

保證了設計區域總能一個方向上鋪滿屏幕,而另外一個方向通常會超出屏幕區域。get

ResolutionPolicy::NO_BORDER狀況下,設計分辨率並非可見區域(VisibleSize),咱們佈局精靈須要根據VisibleOrigin和VisibleSize來作判斷處理。源碼

(3)SHOW_ALL    :按比例放縮,所有展現不裁剪。可能會有黑邊。it

屏幕寬、高分別和設計分辨率寬、高計算縮放因子,io

取較(小)者做爲寬、高的縮放因子。保證了設計區域所有顯示到屏幕上,但可能會有黑邊。

(4)FIXED_WIDTH  :按比例放縮,寬度鋪滿屏幕。

保持傳入的設計分辨率高度不變,根據屏幕分辨率修正設計分辨率的寬度。

(5)FIXED_HEIGHT :按比例放縮,高度鋪滿屏幕。

保持傳入的設計分辨率寬度不變,根據屏幕分辨率修正設計分辨率的高度。

使用FIXED_WIDTH和FIXED_HEIGHT ,可能會有一個方向超出屏幕:

bool AppDelegate::applicationDidFinishLaunching() {
    // initialize director
    auto director = Director::getInstance();
    auto glview = director->getOpenGLView();
    if(!glview) {
        glview = GLViewImpl::createWithRect("My Game", Rect(0, 0, 960, 500), 0.7f);
        director->setOpenGLView(glview);
    }
    auto winSize = Size(480, 320);//設計分辨率
    auto screenSize = glview->getFrameSize();//屏幕分辨率,
    // 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);

    register_all_packages();

    float widthRate = screenSize.width / winSize.width;
    float heightRate = screenSize.height / winSize.height;
    
    if (widthRate < heightRate)
    {
        //說明設計分辨率寬度偏大
        //這時候咱們讓高度適配,寬度裁剪掉。也就是圖片寬度會超出屏幕外
        //設置設計分辨率的和適配模式,進去看setDesignResolutionSize和updateDesignResolutionSize這兩個個方法的源碼能夠知道:
        //下面這句代碼走完以後,設計分辨率的高度被設置成480,可是寬度並非800,而是作了縮放,下面註釋詳細介紹
        director->getOpenGLView()->setDesignResolutionSize(winSize.width, winSize.height, ResolutionPolicy::FIXED_HEIGHT);

    }
    else
    {
        //說明設計分辨率高度偏大
        //這時候咱們讓寬度適配,高度裁剪掉。也就是圖片高度會超出屏幕外
        director->getOpenGLView()->setDesignResolutionSize(winSize.width, winSize.height, ResolutionPolicy::FIXED_WIDTH);
    }
    /*
    updateDesignResolutionSize函數部分源碼:
    _scaleX = (float)_screenSize.width / _designResolutionSize.width;
    _scaleY = (float)_screenSize.height / _designResolutionSize.height;
    if ( _resolutionPolicy == ResolutionPolicy::FIXED_HEIGHT)
    {
        _scaleX = _scaleY;
        //爲了讓_screenSize.width / _designResolutionSize.width = _screenSize.height / _designResolutionSize.height,
        //將_designResolutionSize.width從新賦值
        _designResolutionSize.width = ceilf(_screenSize.width/_scaleY);
    }
    */
    auto scene = HelloWorld::createScene();
    director->runWithScene(scene);

    return true;
}

 

void GLView::setDesignResolutionSize(float width, float height, ResolutionPolicy resolutionPolicy)
{
    CCASSERT(resolutionPolicy != ResolutionPolicy::UNKNOWN, "should set resolutionPolicy");
    
    if (width == 0.0f || height == 0.0f)
    {
        return;
    }

    _designResolutionSize.setSize(width, height);     _resolutionPolicy = resolutionPolicy;          updateDesignResolutionSize();  }

相關文章
相關標籤/搜索