加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 17:15:21 所属栏目:百科 来源:网络整理
导读:适配模式 (1) EXACT_FIT :拉伸变形,使铺满屏幕。 会出现图像拉伸 屏幕宽 与 设计宽比 作为X方向的缩放因子,屏幕高 与 设计高比 作为Y方向的缩放因子。 保证了设计区域完全铺满屏幕,但是可能会出现图像拉伸。 (2) NO_BORDER :按比例放缩,全屏展示不

适配模式

(1)EXACT_FIT :拉伸变形,使铺满屏幕。会出现图像拉伸

屏幕宽 与 设计宽比 作为X方向的缩放因子,屏幕高 与 设计高比 作为Y方向的缩放因子。

保证了设计区域完全铺满屏幕,但是可能会出现图像拉伸。

(2)NO_BORDER :按比例放缩,全屏展示不留黑边。会有超出屏幕区域

屏幕宽、高分别和设计分辨率宽、高计算缩放因子,取较(大)者作为宽、高的缩放因子。

保证了设计区域总能一个方向上铺满屏幕,而另一个方向一般会超出屏幕区域。

ResolutionPolicy::NO_BORDER情况下,设计分辨率并不是可见区域(VisibleSize),我们布局精灵需要根据VisibleOrigin和VisibleSize来做判断处理。

(3)SHOW_ALL :按比例放缩,全部展示不裁剪。可能会有黑边。

屏幕宽、高分别和设计分辨率宽、高计算缩放因子,

取较(小)者作为宽、高的缩放因子。保证了设计区域全部显示到屏幕上,但可能会有黑边。

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读