用户界面分辨率
自动布局系统主要涉及固定和拉伸属性:
如图,总* * *可以修改控件的六个属性,包括上下左右四个图钉,中间两个拉伸条。
影响
1.当打开一个图钉时,当前节点和父节点的相应边之间的距离是固定的。当修改父节点的大小时,当前节点和父节点的对应边之间的距离总是相同的。
2.当打开任意两个相对的图钉时,当前节点与父节点的相应两侧之间的距离是固定的。也就是说,当修改父节点的大小时,当前节点到父节点对应两边的距离之比始终不变。
3.当任何中间拉伸条(如水平拉伸条)打开时,节点的宽度与父节点的宽度之比是固定的。
其他的
1.当上述任何属性未启用时,默认情况下,对象相对于左下角的位置保持不变。
2.目前,只有两种类型的控件对象(文本和FNT字体不可用)和容器具有拉伸栏属性。
二、Cocos 2d-x(Cocos框架)中的相关概念和代码设置
设计分辨率和屏幕分辨率:
首先需要了解两个概念:Cocos2d-x中有两种分辨率:设备分辨率和屏幕分辨率。设备分辨率是当前游戏运行的平台的实际分辨率;设计分辨率就是我们设计的游戏的分辨率。
可以设置设计分辨率,这是我们的游戏程序可以“感知”的分辨率,超出这个区域的部分我们的界面就不会显示。
设计分辨率通常在启动时设置。
app delegate::applicationDidFinishLaunching
在中,代码如下:
导演-& gt;getOpenGLView()-& gt;setDesignResolutionSize(960,640,ResolutionPolicy::FIXED _ HEIGHT);
(这段代码上面还有一句createWithRect,用来在桌面系统上创建一个游戏模拟器。您可以通过修改Rect的最后两个值来修改设备分辨率,但该值在移动设备上无效。)
这个代码是什么意思?
这里设计分辨率设为960,640,游戏界面调整方案设为固定宽度。但是这样设置之后,我们后面得到设计分辨率时得到的尺寸不一定是960,640。这是为什么呢?
看看源代码:
转到setDesignResolutionSize的定义。它做了一些判断和赋值,最后调用updateDesignResolutionSize,继续去updateDesignResolutionSize。该函数的部分代码如下:
//1.计算游戏界面缩放至全屏时X轴和Y轴的缩放率:_ scalex =(float)_ screensize.width/_ designresolutionsize . width;
_ scaleY =(float)_ screensize . height/_ designresolutionsize . height;//2.根据分配策略,调整缩放比例和设计分辨率:if(_ Resolution Policy = = Resolution Policy::no _ border){//将X轴和Y轴缩放值设置为最大。
_scaleX = _scaleY = MAX(_scaleX,_ scaleY);
} else if(_ resolution policy = = resolution policy::show _ all){//将X轴和Y轴缩放值设置为最小值。
_scaleX = _scaleY = MIN(_scaleX,_ scaleY);
} else if(_ resolution policy = = resolution policy::FIXED _ HEIGHT){
_ scaleX = _ scaleY//将X轴和Y轴缩放值固定为Y轴缩放值,调整设计分辨率的宽度,使设计分辨率的宽度在缩放后仍能充满屏幕。
_ designresolutionsize . width = ce ilf(_ screensize . width/_ scaleX);
} else if(_ resolution policy = = resolution policy::FIXED _ WIDTH){
_ scaleY = _ scaleX//将X轴和Y轴缩放值固定为X轴缩放值,并调整设计分辨率的高度,使设计分辨率的高度在缩放后仍能充满屏幕。
_ designresolutionsize . height = ce ilf(_ screensize . height/_ scaleY);
}//其他缩放策略:EXACT_FIT不做调整。
这段代码主要做两件事:
1.根据设备分辨率和设计分辨率计算游戏界面的缩放率;
2.调整设计分辨率。
根据上面的源代码,我们应该能够很容易地理解几种缩放策略的意义:
NO_BORDER是在保持设计分辨率不变的情况下,按比例缩放游戏界面以填充屏幕。游戏的顶部、底部或左侧和右侧可以被裁剪。
Show _ all (Cocos2D-X默认方案)是在保持设计分辨率不变的情况下,将游戏界面缩放到设计分辨率的一侧以托住屏幕。游戏的顶部、底部或左右两侧可能会有黑边。
FIXED_HEIGHT是固定设计分辨率的高度,调整设计分辨率的宽度,使设计分辨率的长宽比与设备分辨率的长宽比相同,然后缩放游戏界面以充满屏幕。
FIXED_WIDTH同上,只是宽度保持不变。
EXACT_FIT是最粗暴的方式,直接缩放游戏界面填充整个屏幕,X轴和Y轴的缩放比例不一定相同。
那么,我们应该选择哪种方案呢?自然,我们应该选择固定高度或固定宽度。因为只有在这两种方案下,界面才会根据设备分辨率自动调整设计分辨率,填满屏幕。
接下来,加载接口。
加载接口在HelloWorld::init中进行:
auto root node = cs loader::create node(" main scene . csb ");
auto size = Director::getInstance()-& gt;getVisibleSize();
根节点-& gt;setContentSize(大小);
ui::Helper::doLayout(root node);
addChild(root node);
除了用createNode加载接口并将其添加到HelloWorld之外,这里还做了两件事:
设置加载接口的ContentSize,对rootNode调用ui::Helper::doLayout处理加载接口。
为什么要这样设计?让它自动化多好啊。
第一个原因:与编辑不一致;第二个原因是,自动调整接口被设计为被动的,如果主动执行,可能会造成大量的性能损失——如果每次设置大小时都要重新遍历所有子节点的位置,会浪费多少CPU时间。
效果:
设备分辨率X/Y大于设计分辨率X/Y,配置策略为定高。
请点击输入图片说明。
设备分辨率X/Y大于设计分辨率X/Y,配置策略为定宽。
请点击输入图片说明。
设备分辨率X/Y小于设计分辨率X/Y,配置策略为定高。
请点击输入图片说明。
设备分辨率X/Y小于设计分辨率X/Y,配置策略为定高。
请点击输入图片说明。
PS:枚举类型ResolutionPolicy是框架提供的一种方便的默认方案。其实我们可以在设置设计分辨率之前先得到设备分辨率,然后根据设备分辨率调整设计分辨率。