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适配机制的更多相关文章

  1. 用swing也可以做出好看的界面

    用Swing做出的例子:JavaFX做出的界面:后来又做出了自己编写的一套基于Synth的L&F,其与直接在代码中重绘某个组件不同,最大优点是具有可插拔性,即在不改变原有程序代码的情况下,用户 ...

  2. Vmware 中安装 Ubuntu Server (或者ubuntu 以文本界面登陆时) 分辨率无法全屏问题

    Vmware 中安装 Ubuntu Server/Ubuntu 分辨率,无法全屏问题 需要更改grub设置 在终端或者文本界面按下列步骤进行设置: 第一步: 输入命令 sudo vim /etc/de ...

  3. jquery 做出专业的界面,SHOW 一下最近的成果~~~

    最近在项目中把整个UI框架重新做了一下,都是用Jquery实现的,没有使用EXT.EasyUI那一类的UI框架再也不用担心版权问题啦~~~~~~ 接下来我会在博客中把常用的功能分享出来,先上一下动态T ...

  4. android 常见分辨率(mdpi、hdpi 、xhdpi、xxhdpi )屏幕适配

    http://www.tuicool.com/articles/nuyMZb 1 Android手机目前常见的分辨率 1.1 手机常见分辨率: 4:3 VGA     640*480 (Video G ...

  5. JS框架整理

    1. Dojo (演示地址) Dojo是一个强大的面向对象JavaScript框架.主要由三大模块组成:Core.Dijit.DojoX.Core提供ajax,events,packaging,CSS ...

  6. C#之WinForm界面分辨率问题

    在做上一个C#小工具的时候,当时为了处理界面最大化,分辨率问题,只是简单的用各种···Panle控价简单随意的处理控件的大小位置,字体什么的就随缘了(貌似有点不负责任啊,嘿嘿~). 所以在开始第二个C ...

  7. Android 界面排版的5种方式

    Android布局是应用界面开发的重要一环,在Android中,共有五种布局方式,分别是:FrameLayout(框架布局),LinearLayout (线性布局),AbsoluteLayout(绝对 ...

  8. Android屏幕适配全攻略(最权威的官方适配指导)屏幕尺寸 屏幕分辨率 屏幕像素密度 dpdipdpisppx mdpihdpixdpixxdpi

    Android屏幕适配全攻略(最权威的官方适配指导)原创赵凯强 发布于2015-05-19 11:34:17 阅读数 153734 收藏展开 转载请注明出处:http://blog.csdn.net/ ...

  9. 手机设计尺寸 - iPhone界面尺寸

    参考网址: http://www.qijishow.com/down/app-index.htm iPhone界面尺寸 设备 分辨率 PPI 状态栏高度 导航栏高度 标签栏高度 iPhone6 plu ...

随机推荐

  1. %u编码

    Escape/Unescape加密解码/编码解码,又叫%u编码,从以往经验看编码字符串出现有"u",它是unicode编码,那么Escape编码采用是那一种unicode实现形式呢 ...

  2. php实验四

    实验四 1.创建一个Person类,Person中包含三个属性name,age,wealth,分别设置为public,private,protected,再定义Person类的子类Student. 2 ...

  3. upload&&download

    package am.demo;  import java.io.File;  import java.io.IOException;  import java.util.Iterator;  imp ...

  4. VC++ 实现简单的桌面截图

    使用了EasyX图像库,使用方法请参考:VC++ 制作一个简易的控制台时钟应用 简单的桌面截图代码: ///////////////////////////////////////////////// ...

  5. 【python】装饰器

    来源:廖雪峰 看了好多次装饰器,发现还是廖老师讲得好,能让我看懂..... 下面是一段装饰器代码 @log def now(): " 它的含义等价于 def now(): " no ...

  6. 【leetcode】Perfect Squares (#279)

    Given a positive integer n, find the least number of perfect square numbers (for example, 1, 4, 9, 1 ...

  7. Hbase+ Phoenix搭建教程

    Hbase+ Phoenix搭建教程 一.Hbase简介 HBase是基于列存储.构建在HDFS上的分布式存储系统,其主要功能是存储海量结构化数据. HBase构建在HDFS之上,因此HBase也是通 ...

  8. 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 ...

  9. 数学 SRM 690 Div1 WolfCardGame 300

    Problem Statement      Wolf Sothe and Cat Snuke are playing a card game. The game is played with exa ...

  10. oracle 取小数位数

    select ltrim('124532.62879'-floor('124532.62879'),'0.') from dual;select length(66695) from dual; 这两 ...