cocostudio做出来的界面如何进行分辨率适配,兼论cocos2dx3的多分辨率适配机制,以及retina适配机制
cocos有很多代码实际上都不再使用了,看代码时反而误导了程序员。
比如一个简单的分辨率适配,我查到了setContentSize,然后调用setContentSize,毫无用处啊!于是乎,我到处查资料,终于发现解决办法,非常简单,纪录在下面。
做界面时,使用固定的设计分辨率,需要某个元素适配分辨率时,使用右边的锚点设置。做好以后载入进来,如此调用:
Node* uiNode = CSLoader::getInstance()->createNode("file.csb");
Size size(width, height); //你要的屏幕分辨率
uiNode->setContentSize(size);
ui::Helper::doLayout(uiNode);
这样,布局就根据分辨率自动适配啦。
cocos中的Director还有一个contentScaleFactor的概念,这个怎么理解呢?从名字上看很有迷惑性,会让人觉得这个也是做分辨率适配的,事实上它和designedResolution是两套不干涉的系统。从代码里可以看出,设置投影矩阵时使用的是winSize,而winSize来自designedResolution。同时设置Viewport时用的也是winSize。
我们三维投影有两个阶段:世界坐标系->摄像机坐标系,摄像机坐标系->投影坐标系(z值发生变化,并进行了透视矫正),投影坐标系->屏幕坐标系。对2d渲染来说,摄像机坐标系直接被跳过,投影矩阵完成了第一第二步,cocos在这里用的就是winSize,将winSize范围内(其实也就是designedResolution,代码为证,见Director::setOpenGLView。因此,这意味着designedResolution大小范围内的几何体被变换到标准投影空间[-0.5, 0.5]。 第三步到屏幕坐标系的转换,使用的也是winSize;只不过这时,会将winSize乘以在setDesignedResolution时被纪录的scale得到一个和屏幕大小相匹配的大小,也就是说如果设计宽高和屏幕宽高不匹配,则在这一步以glViewPort的形式被缩放成匹配的(这时Viewport可能超过屏幕,比如你选择了NOBORDER,而宽高比又不相同)。这里scale并没有考虑retina缩放系数,因此对于Retina的ipad,这里的屏幕分辨率依然是1024x768。因此viewportimp中还乘以了一个retinafactor,把它变成2048x1536。
上面讨论了cocos的分辨率适配机制,可以看出,这个Director的contentScaleFactor压根就没有用到,因此它不影响三维渲染过程。
那么它影响的是什么呢?答案是它影响了每个面片的大小。cocos如何产生多边形?用sprite为例,它得到texture的size,然后就以这个size作为sprite多边形的宽高:注意,这个机制就是为什么要有contentScalefactor的根本原因,而以此出发,很容易明白为什么三维游戏不需要这个东西。此时的size其单位是逻辑坐标,不包含retinascale的,也就是说在retina显示器中依然用的是逻辑坐标1024x768(对ipad)。这时就有一个问题了,对retina显示器而言,同是逻辑大小50*50的区域,它有100*100个点,因此为什么不直接用100*100的图片呢?不行!因为前面所述,cocos生成多边形依赖了资源大小,此时会产生逻辑大小100x100的片,占用200x200的屏幕点。
于是Director的contentScaleFactor就闪亮登场了。它在所有取资源大小的地方都加入,作为乘数缩放了资源大小到我们的逻辑大小。如果你是两倍大小的retina资源,只需要设置contentScaleFactor为2,它们在载入的时候会生成一半大小的面片,从而符合了游戏设计分辨率。
。
cocostudio做出来的界面如何进行分辨率适配,兼论cocos2dx3的多分辨率适配机制,以及retina适配机制的更多相关文章
- 用swing也可以做出好看的界面
用Swing做出的例子:JavaFX做出的界面:后来又做出了自己编写的一套基于Synth的L&F,其与直接在代码中重绘某个组件不同,最大优点是具有可插拔性,即在不改变原有程序代码的情况下,用户 ...
- Vmware 中安装 Ubuntu Server (或者ubuntu 以文本界面登陆时) 分辨率无法全屏问题
Vmware 中安装 Ubuntu Server/Ubuntu 分辨率,无法全屏问题 需要更改grub设置 在终端或者文本界面按下列步骤进行设置: 第一步: 输入命令 sudo vim /etc/de ...
- jquery 做出专业的界面,SHOW 一下最近的成果~~~
最近在项目中把整个UI框架重新做了一下,都是用Jquery实现的,没有使用EXT.EasyUI那一类的UI框架再也不用担心版权问题啦~~~~~~ 接下来我会在博客中把常用的功能分享出来,先上一下动态T ...
- android 常见分辨率(mdpi、hdpi 、xhdpi、xxhdpi )屏幕适配
http://www.tuicool.com/articles/nuyMZb 1 Android手机目前常见的分辨率 1.1 手机常见分辨率: 4:3 VGA 640*480 (Video G ...
- JS框架整理
1. Dojo (演示地址) Dojo是一个强大的面向对象JavaScript框架.主要由三大模块组成:Core.Dijit.DojoX.Core提供ajax,events,packaging,CSS ...
- C#之WinForm界面分辨率问题
在做上一个C#小工具的时候,当时为了处理界面最大化,分辨率问题,只是简单的用各种···Panle控价简单随意的处理控件的大小位置,字体什么的就随缘了(貌似有点不负责任啊,嘿嘿~). 所以在开始第二个C ...
- Android 界面排版的5种方式
Android布局是应用界面开发的重要一环,在Android中,共有五种布局方式,分别是:FrameLayout(框架布局),LinearLayout (线性布局),AbsoluteLayout(绝对 ...
- Android屏幕适配全攻略(最权威的官方适配指导)屏幕尺寸 屏幕分辨率 屏幕像素密度 dpdipdpisppx mdpihdpixdpixxdpi
Android屏幕适配全攻略(最权威的官方适配指导)原创赵凯强 发布于2015-05-19 11:34:17 阅读数 153734 收藏展开 转载请注明出处:http://blog.csdn.net/ ...
- 手机设计尺寸 - iPhone界面尺寸
参考网址: http://www.qijishow.com/down/app-index.htm iPhone界面尺寸 设备 分辨率 PPI 状态栏高度 导航栏高度 标签栏高度 iPhone6 plu ...
随机推荐
- %u编码
Escape/Unescape加密解码/编码解码,又叫%u编码,从以往经验看编码字符串出现有"u",它是unicode编码,那么Escape编码采用是那一种unicode实现形式呢 ...
- php实验四
实验四 1.创建一个Person类,Person中包含三个属性name,age,wealth,分别设置为public,private,protected,再定义Person类的子类Student. 2 ...
- upload&&download
package am.demo; import java.io.File; import java.io.IOException; import java.util.Iterator; imp ...
- VC++ 实现简单的桌面截图
使用了EasyX图像库,使用方法请参考:VC++ 制作一个简易的控制台时钟应用 简单的桌面截图代码: ///////////////////////////////////////////////// ...
- 【python】装饰器
来源:廖雪峰 看了好多次装饰器,发现还是廖老师讲得好,能让我看懂..... 下面是一段装饰器代码 @log def now(): " 它的含义等价于 def now(): " no ...
- 【leetcode】Perfect Squares (#279)
Given a positive integer n, find the least number of perfect square numbers (for example, 1, 4, 9, 1 ...
- Hbase+ Phoenix搭建教程
Hbase+ Phoenix搭建教程 一.Hbase简介 HBase是基于列存储.构建在HDFS上的分布式存储系统,其主要功能是存储海量结构化数据. HBase构建在HDFS之上,因此HBase也是通 ...
- PHP 汉字数字互转(100以内)| PHP 汉字转数字 | PHP数字转汉字
<?php function numDatabase(){ $numarr =array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,2 ...
- 数学 SRM 690 Div1 WolfCardGame 300
Problem Statement Wolf Sothe and Cat Snuke are playing a card game. The game is played with exa ...
- oracle 取小数位数
select ltrim('124532.62879'-floor('124532.62879'),'0.') from dual;select length(66695) from dual; 这两 ...