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. ID属性值为小数

    获取带有.的id值 <h1 id="123.45">dom对象</h1> <script> $('#123\\.45').attr('id') ...

  2. samtools常用命令详解

    samtools的说明文档:http://samtools.sourceforge.net/samtools.shtmlsamtools是一个用于操作sam和bam文件的工具合集.包含有许多命令.以下 ...

  3. 一次dell R420 电源故障引发的“血案”

    说“血案”有写夸张了,其实是也就熬了一夜的通宵,做运维的伤不起啊,作为一名运维工程师,像这种服务器突发故障半夜起床的情况属于家常便饭,见怪不怪了,开始说正事: 前几天半夜12点左右,收到服务器宕机的消 ...

  4. 前端开发必备!Emmet语法

    使用方法 emmet的使用方法也非常简单,以sublime text为例,直接在编辑器中输入HTML或CSS的代码的缩写,然后按tab键就可以拓展为完整的代码片段.(如果与已有的快捷键有冲突的话,可以 ...

  5. SQL查询第m条到第n条的方法

    SQL查询第m条到第n条的方法 如表名为GOOD Sselect top (n-m) * from GOODS where (某一列名) not in (select top m (某一列名) fro ...

  6. October 19th Week 43rd Wednesday, 2016

    I find that the harder I work, the more luck I seem to have. 越努力,越幸运. However, I find that the harde ...

  7. PHP日期与时间

    时间戳是自 1970 年 1 月 1 日(00:00:00 GMT)以来的秒数.它也被称为 Unix 时间戳(Unix Timestamp).Unix时间戳(Unix timestamp),或称Uni ...

  8. PHP的命名空间 与类是自动加载

    namespace 假设如果不使用namespace,那么每个类在一个项目中的名字就必须是固定的.因为php在new的时候不管是调用autoload还是调用已加载过的类,都存在一个类名对应的文件.所以 ...

  9. SPRING MVC总结

    DispatcherServlet -- 前置控制器HandlerMapping接口 -- 处理请求的映射HandlerMapping接口的实现类:DefaultAnnotationHandlerMa ...

  10. Guava学习笔记(3):复写的Object常用方法

    转自:http://www.cnblogs.com/peida/p/Guava_Objects.html 在Java中Object类是所有类的父类,其中有几个需要override的方法比如equals ...