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. 如何创建 Code Snippet

    比如有一行自定义代码段: @property (nonatomic,copy) NSString *<#string#>; 需要添加到 Code Snippet 上,以帮助开发人员开发更便 ...

  2. C语言字符串操作总结大全

    1)字符串操作 strcpy(p, p1)  复制字符串  函数原型strncpy(p, p1, n)   复制指定长度字符串  函数原型strcat(p, p1)   附加字符串  函数原型strn ...

  3. [LeetCode] Reverse Linked List II

    Reverse a linked list from position m to n. Do it in-place and in one-pass. For example:Given 1-> ...

  4. flume到kafka和hbase配置

    # Flume test file# Listens via Avro RPC on port 41414 and dumps data received to the logagent.channe ...

  5. [笔记]HTML

    链接 <a href="链接地址">链接显示名</a> <a name="C4">target</a> < ...

  6. div滚动底部加载li,window滚动底部加载li

    DIV固定高度滚动条滚动最底部,加载新的li <!DOCTYPE html> <html> <head> <meta charset="UTF-8& ...

  7. 比管理员(administrator)更高权限的TrustedInstaller

    http://www.gezila.com/tutorials/9664.html 什么是TrustedInstaller管理权限 ?好多朋友都在使用Windows7系统.在使用过程中,有些朋友在删除 ...

  8. CentOS7中DHCP配置

    因为需要网络引导系统的安装,所以需要安装和配置DHCP服务器.DHCP(Dynamic Host Configuration Protocol) 动态主机配置协议,它提供了一种动态指定IP地址和配置参 ...

  9. github page

    使用github page 可以查看仓库中保存的网页的事例 新建gh-pages的分支,然后点击上方的page按钮即可配置相应的链接以及地址 注:默认情况下显示的是当前文件下的index.html文件 ...

  10. KVO 键值观察者

    KVO(键值观察者) //监听的创建 -(id)initChildren:(Person *)person { self = [super init]; if (self != nil) { //拥有 ...