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();  }

相关文章
相关标签/搜索