转载请注明原文地址:https://segmentfault.com/a/1190000000635287

研究了两天屏幕适配,了解了Cocos提供的屏幕适配的方案有下面几种:
1, EXACT_FIT
使用这个选项,可以保证设计区域完全铺满屏幕,但是可能会出现界面被拉伸。

2, SHOW_ALL
按原始比例进行缩放,图片不变形,为了保证缩放后较长的边也能完全显示,较短的边剩下的位置会用黑边填充,居中显示。

3, NO_BORDER
这个和上面的SHOW_ALL相反,按原始比例进行缩放,图片不变形,为了保证缩小后较短的边全屏显示,较长的边超出屏幕的部分会被裁剪,不会出现黑边,而且铺满屏幕

下面两种在Cocos2d-x 3.x版本里新添加的(没仔细了解):
4, FIXED_HEIGHT
保持传入的设计分辨率高度不变,根据屏幕分辨率修正设计分辨率的宽度。
适合高方向需要撑满,宽方向可裁减的游戏,结合setContentScaleFactor(RH/DH)使用

5、FIXED_WIDTH
保持传入的设计分辨率宽度不变,根据屏幕分辨率修正设计分辨率的高度。
适合宽方向需要撑满,高方向可裁减的游戏,结合setContentScaleFactor(RW/DW)使用。

使用的时候设置也很简单,按照我现在的理解,这个屏幕适配设置一次以后就无需再管理了,在function main 里添加:

cc.Director:getInstance():getOpenGLView():setDesignResolutionSize(设计分辨率的宽度, 设计分辨率的高度, cc.ResolutionPolicy.NO_BORDER) -- NO_BORDER可以修改成上面任意一种模式

了解这些之后,觉得NO_BORDER是最合适的,然后继续研究如何做出游戏主菜单,我是使用Cocos Studio来做UI的,画好的UI如何导入到项目和使用这里就不详细说了,不了解的参考之前写的博客 查看,使用Cocos Studio做UI的时候,我的理解是画布的大小就是设计分辨率的大小,所以画布大小应该和程序里setDesignResolutionSize的宽高一致,比如设计的是一个以iphone4为准的横屏游戏,那画布的宽高就设置成960 * 640,对应的程序设置应该是setDesignResolutionSize(960, 640, cc.ResolutionPolicy.NO_BORDER)

把做好的UI导入到程序里之后,在各个分辨率下运行,是自己期望的结果,到此屏幕适配研究完成了,但是使用NO_BORDER的方式适配屏幕会带来一个问题,就是根据运行设备屏幕的大小不同,有可能上下左右的某两条靠近边线一部分内容会被裁掉看不到,附上2张个效果图
我的Demo是基于960 * 640分辨率设计的
1,在960 * 640分辨率模拟器下运行效果:

2,在1280 * 720分辨率模拟器下运行效果:

可以明显的看到第2张图上下各有一部分因为分辨率的关系被裁剪了,但是这不是我期望的结果,我希望某些控件是始终能完全显示在界面上的,比如我的游戏名称logo

最终想到的一个解决方案是Cocos Studio弄两个Panel,一个负责加载绝对定位的控件,一个负责加载相对定位的控件,在程序载入UI之后,根据屏幕大小把负责加载相对定位的Panel大小修改成屏幕大小,这样这个Panel里面的控件就会根据先对定位显示到合适的位置,具体步骤如下:

在Cocos Studio里拖界面的时候,使用结构:

这里rootPanel是960 * 640大小的(全屏),activePanel是rootPanel的子视图,并且铺满rootPanel。

把不需要根据屏幕的变化而改变位置的控件放入到rootPanel里,比如开始游戏按钮,和界面的背景底图,设置rootPanel的子空间布局为绝对布局,然后activePanel的子空间布局设置成相对布局,这个时候放入activePanel里的控件位置是相对于activePanel的定位的

特别注意:

  1. rootPanel的子空间布局一定要设置成绝对布局
  2. 在设计activePanel的属性时,千万不要使用百分比,包括设置"尺寸和模式"和"控件布局"的时候

上面两点都会导致想要在程序里动态设置activePanel大小和位置的时候无效,血的教训呀!!!

把UI按照上面的思路画完之后,导入到项目里,这个时候需要做的是拿到activePanel对象、当前屏幕读取的分辨率大小、和从画布(UI界面)的什么位置开始读activePanel设置合适的位置和大小,然后把具体看下面代码:

local ui      = rootNode:getChildByName("activePanel") -- 得到activePanel节点
local size    = cc.Director:getInstance():getVisibleSize() -- 屏幕分辨率大小
local origin  = cc.Director:getInstance():getVisibleOrigin() -- 从画布的某个点显示-- 如果origin.x不等于0,表示是左右是被裁过的,把activePanel的x位置设置到屏幕里的0的位置
if origin.x ~= 0 thenui:setPositionX(ui:getPositionX() + origin.x)
end-- y的设置理解同上,上下被裁过的
if origin.y ~= 0 thenui:setPositionY(ui:getPositionY() + origin.y)
end-- 通过上面两个判断设置,ui在显示起始位置被固定好了,接下来设置ui的大小等于屏幕的大小,就大功告成了
ui:setContentSize(size)

做上面的处理,得到的结果就是期望的结果了,在960*640不会产生任何边变化,这里不贴图了
在1280 * 720下得效果图:

大功告成!!!

cocos2d-x lua 屏幕适配相关推荐

  1. cocos2d 屏幕適配_Cocos2d-x 3.1 一步步做屏幕适配

    本文并不想讲关于屏幕适配的概念或者大道理,如果还不了解cocos2d-x屏幕适配的,请先看这篇文章:http://www.cocoachina.com/gamedev/cocos/2014/0516/ ...

  2. cocos2d 屏幕適配_cocos2d-x 2.x屏幕适配基础

    一开始我就忽略了屏幕适配的问题,现在才发现它是多么的重要.通过实践才领悟了其基础概念,而屏幕适配的策略是建立在其上的,有很多,但我还没有认真研究.这里仅把自己对屏幕适配基础知识进行一个梳理. 关于屏幕 ...

  3. cocos2d 屏幕適配_cocos2d-x 屏幕适配新解

    转自:http://blog.leafsoar.com/archives/2013/05-10-19.html 为了适应移动终端的各种分辨率大小,各种屏幕宽高比,在 cocos2d-x(当前稳定版:2 ...

  4. Cocos2d-x 屏幕适配新解(比较全面比较详细)

    黑米GameDev街区 『 不要让任何事情成为你不去学习的理由!』 -Himi Home About Himi Himi's Book 街区须知 资源/技术群 订阅本站 主页 > Cocos2d ...

  5. cocos2dx的屏幕适配

    1.版本 cocos3.9 2.屏幕适配 cocos有5种屏幕适配策略. EXACT_ALL:非等比缩放,使画面充满整个屏幕,但会变形. NO_BORDER:等比缩放,也会使画面充满整个屏幕,不会变形 ...

  6. Cocos2D-X屏幕适配新解

    为了适应移动终端的各种分辨率大小,各种屏幕宽高比,在 Cocos2D-X(当前稳定版:2.0.4) 中,提供了相应的解决方案,以方便我们在设计游戏时,能够更好的适应不同的环境. 而在设计游戏之初,决定 ...

  7. cocos2d-x 屏幕适配原理分析

    cocos2d-x作为著名的cocos2d游戏开发框架的C++实现者,最近一年发展迅猛.越来越多的app使用它实现快速多平台部署,从最初的ios,android,win32等到新近的html5,实现移 ...

  8. iOS开发之绝对布局和相对布局(屏幕适配)

    在IOS的UI设计中也有绝对定位和相对定位,和我们的web前端的绝对定位和相对定位有所不同但又有相似之处.下面会结合两个小demo来学习一下我们IOS开发中UI的绝对定位和相对定位.在前面的博客中所用 ...

  9. 关于IOS的屏幕适配(iPhone)——资源适配

    IOS的屏幕适配几乎不需要大量的代码操作,更多的时间我们只是动动鼠标选择一下就搞定.可以苹果在这方面做的还是比较人性的,解放了开发者. 首先来说说Iphone这几种屏(由于最近做的是iPhone AP ...

最新文章

  1. 使用expect 打通到其他服务器无密码访问
  2. 3 种发布策略,解决 K8s 中快速交付应用的难题
  3. php 跨区域,如何构造PHP的内容包括在非安全(http://)和安全(https://)区域以及跨多个目录使用?...
  4. 分治——Secret Cow Code S(洛谷 P3612)
  5. java 代码压缩javascript_利用Java来压缩 JavaScript 代码详解
  6. luogu P1273 有线电视网
  7. linux通过yum安装vim,linux/centos系统如何使用yum安装vi/vim?(转)
  8. 一键查看MTALAB支持的字体
  9. 不需要PM3/PN532也可以搞定加密卡!利用小米9、小米手环NFC模拟加密门禁卡的傻瓜式保姆级教程
  10. android文字立体,3d立体字转换器
  11. 内网/外网介绍以及两者比较
  12. android 有哪些设备id,Android之设备ID(Device ID)
  13. 【AI with ML】第 5 章 :自然语言处理简介
  14. 英特尔核显驱动hd630_AMD与英特尔彻底失去合作关系?中止Kaby Lake-G更新支持
  15. [OpenSource] AWBot-一款小巧的测试Web站点的工具
  16. 计算机操作系统--Linux初试03
  17. ATI移动显卡全系列型号及参数一览表
  18. mysql datetime 计算相隔时间
  19. iOS端实现登录输入框的三种思路(包含UIBezierPath等)
  20. 内含福利|云栖攻略·解锁视频消费新方式

热门文章

  1. 【PyTorch】提高mnist模型精确度
  2. vc++6.0中文乱码的解决方法
  3. 机器学习实战笔记(一)机器学习基础
  4. 利用Nginx正向代理加速代码编译外网依赖下载速度
  5. 如何学计算机打字,如何学习最快的电脑打字如何为电脑新手快速学习打字
  6. C语言合法标识符(含知识点)
  7. 足球比赛数据分析系统
  8. vue2集成海康摄像头
  9. Origin 如何输出高清图片
  10. Lenet、Alexnet 、VGG、 GoogleNet、ResNet模型