Cocos2dx 3.x 屏幕适配
Cocos2dx 3.10+Cocos Studio3.10
1.在适配过程中必须明确几个概念:
①Frame大小:这个值在windows/mac/linux下就是创建窗体的大小,在手机上就是屏幕大小。
设置方式:这里我们设置一个全局的变量(这个是iphone5/5s的分辨率)。
static cocos2d::Size g_frame_size = cocos2d::Size(, );
auto director = Director::getInstance();
auto glview = director->getOpenGLView();
if(!glview) {
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) || (CC_TARGET_PLATFORM == CC_PLATFORM_MAC) || (CC_TARGET_PLATFORM == CC_PLATFORM_LINUX)
glview = GLViewImpl::createWithRect("ScreenFix", Rect(, , g_frame_size.width, g_frame_size.height)); //这里设置窗体大小
#else
glview = GLViewImpl::create("ScreenFix"); //这里就是手机屏幕大小
#endif
director->setOpenGLView(glview);
}
获取方式:
Size cur_frame_size = Director::getInstance()->getOpenGLView()->getFrameSize();
②Design分辨率大小:逻辑设计分辨率大小,美术可以根据这个设计分辨率来设计资源大小以及UI布局。会根据不同的分辨率适配策略,按Frame和Design的某种比例进行缩放。
设置方式:这里我们设置一个全局的变量(这个是比较常用的分辨率),后面将不断修改分辨率策略对画面整体的影响。
static cocos2d::Size g_design_resolution_size = cocos2d::Size(, );
glview->setDesignResolutionSize(g_design_resolution_size.width, g_design_resolution_size.height, ResolutionPolicy::EXACT_FIT); //这里设置分辨率策略
获取方式:(注意:修改分辨率策略,获得的设计分辨率将不一样!!!)
Size cur_design_size = Director::getInstance()->getOpenGLView()->getDesignResolutionSize();
③VisibleSize:可视区域大小,一般情况下UI都要在可视范围内,根据这个值可以对UI进行位置的适配。
获取方式:
Size cur_visible_size = Director::getInstance()->getOpenGLView()->getVisibleSize();
④VisibleOrigin:可视区域原点位置,用于可视区域位置的计算。
获取方式:
Vec2 cur_origin = Director::getInstance()->getOpenGLView()->getVisibleOrigin();
2.分辨率策略:根据不同分策略,将设计分辨率的画面进行缩放。
①EXACT_FIT:缩放设计分辨率画面,铺满整个窗体(手机)。会产生拉伸变形,一般情况下不使用。
②SHOW_ALL:按照设计分辨率的锁定比例,缩放设计分辨率画面,不变形、不裁剪填充窗体(手机)。会产生黑边,一般情况下不使用。
③FIXED_HEIGHT:按照 窗体(手机)分辨率高度/设计分辨率高度 的比例,缩放设计分辨率画面。这种设计分辨率,适合于横版游戏。美术出底图资源时,要保证宽度足够,否则会穿帮。
④FIXED_WIDTH:按照 窗体(手机)分辨率宽度/设计分辨率宽度 的比例,缩放设计分辨率画面。这种设计分辨率,适合于竖版游戏。美术出底图资源时,要保证高度足够,否则会穿帮。
⑤NO_BORDER:按照设计分辨率的锁定比例,缩放设计分辨率画面,不变形、裁剪填充窗体(手机)。会产生裁剪,可视原点位置会修改。
3.下面使用Cocos Studio用设计分辨率(960,640)设计一个基本的场景,里面包含一张底图(四个角都有红色框标记)。一个layout,layout的右上角有一个button。
(使用layout容器,可以包含所有UI,然后对UI进行位置的适配。)入下图:
4.加载csb后,使用不同策略,得到的图像和数值如下:
①EXACT_FIT
输出的值:
cur_frame_size : width = 1136.000000 height = 640.000000
cur_visible_size : width = 960.000000 height = 640.000000
cur_origin : x = 0.000000 y = 0.000000
cur_design_size : width = 960.000000 height = 640.000000
图像分析:
图像拉伸变形;四角可见;右上角button可见;
②SHOW_ALL
输出的值:
cur_frame_size : width = 1136.000000 height = 640.000000
cur_visible_size : width = 960.000000 height = 640.000000
cur_origin : x = 0.000000 y = 0.000000
cur_design_size : width = 960.000000 height = 640.000000
图像分析:
图像没有拉伸变形,没有裁剪;四角可见;右上角button可见;
③FIXED_HEIGHT
输出的值:(注意VisibleSize和DesignSize的改变)
cur_frame_size : width = 1136.000000 height = 640.000000
cur_visible_size : width = 1136.000000 height = 640.000000
cur_origin : x = 0.000000 y = 0.000000
cur_design_size : width = 1136.000000 height = 640.000000
图像分析:
图像没有拉伸变形;四角可见;右上角button可见;右侧图像空缺,所以使用这种方式,需要美术出底图时足够宽,否则穿帮。
如果Frame的width太小时,右下角标记,右上角标记,以及button将消失。比如设置g_frame_size = (640, 640)时,得到入下图结果:
④FIXED_WIDTH
输出的值:(注意VisibleSize和DesignSize的改变)
cur_frame_size : width = 1136.000000 height = 640.000000
cur_visible_size : width = 960.000000 height = 541.000000
cur_origin : x = 0.000000 y = 0.000000
cur_design_size : width = 960.000000 height = 541.000000
图像分析:
图像没有拉伸变形;左上角标记、右上角标记以及button消失;
如果Frame的height足够大时,顶部将出现黑边,所以采用这种模式,美术提供的底图高度必须足够,否则将穿帮。比如设置g_frame_size = (1136, 960)时,得到入下图结果:
⑤NO_BORDER
输出的值:(注意VisibleSize和VisibleOrigin的值)
cur_frame_size : width = 1136.000000 height = 640.000000
cur_visible_size : width = 960.000061 height = 540.845093
cur_origin : x = -0.000031 y = 49.577454
cur_design_size : width = 960.000000 height = 640.000000
图像分析:
图像没有拉伸变形,有裁剪;四个角的标记以及button都消失。
4.从上面可以看到,分辨率策略方式不一样,button位置变化。一般情况下,我们需要将UI上的元素都按照位置比例限制在可视区域内(在这里就是将button限制在屏幕的右上角上)。
按照当前经过缩放的设计分辨率和原来的设计分辨率之间的比例,就可以计算得到UI的相对位置,保证了button一定出现在右上角的位置;
if (cocos2d::Node* csb_node = CSLoader::createNode("res/MainScene.csb")){
if (Layout* layout = dynamic_cast<Layout*>(csb_node->getChildByName("Layout"))){
if (Button* button = dynamic_cast<Button*>(layout->getChildByName("Button"))){ //按照比例以及可视位置原点计算位置
float pos_x_scale = cur_design_size.width / g_design_resolution_size.width;
float pos_y_scale = cur_design_size.height / g_design_resolution_size.height; button->setPositionX(pos_x_scale*button->getPositionX() - cur_origin.x);
button->setPositionY(pos_y_scale* button->getPositionY() - cur_origin.y);
}
}
this->addChild(csb_node);
}
以上,完。
Cocos2dx 3.x 屏幕适配的更多相关文章
- cocos2d-x 3.10 屏幕适配问题
cocos2d-x 的屏幕适配问题困扰了我很久,差不多有一个星期吧.通过亲身实践才解决了问题,分享一下解决办法,供大家借鉴学习. 其实解决办法很简单,把下面代码注释掉就好了 // if (frameS ...
- Cocos2dx开发之屏幕适配
由于各种智能手机的屏幕大小都不一致,会出现同一张图片资源在不同的设备分辨率下显示不一样的问题.为避免这样的情况,需要Cocos引擎能提供多分辨率的支持,也就是说要求实现这样的效果 — 开发者不需要考虑 ...
- cocos2dx屏幕适配方案
我们在利用cocos2dx来开发游戏时,在开始时就不可避免的会遇到屏幕适配问题,来使我们的游戏适应移动终端的各种分辨率大小.目前,大家采用的屏幕适配方案不一,网上的资料也比较丰富,下面我也将自己使用的 ...
- Cocos2d-x——Cocos2d-x 屏幕适配新解 – 兼容与扩展【转载】
Cocos2d-x 屏幕适配新解 – 兼容与扩展 本文出自[无间落叶](转载请保留出处):http://blog.leafsoar.com/archives/2013/05-13-08.html 在读 ...
- Cocos2d-x——Cocos2d-x 屏幕适配新解【转载】
Cocos2d-x 屏幕适配新解 本文出自[无间落叶](转载请保留出处):http://blog.leafsoar.com/archives/2013/05-10-19.html 为了适应移动终端的各 ...
- cocos2d-x 屏幕适配新解
转自:http://blog.leafsoar.com/archives/2013/05-10-19.html 为了适应移动终端的各种分辨率大小,各种屏幕宽高比,在 cocos2d-x(当前稳定版:2 ...
- cocos2dx ——屏幕适配
本文出自 “夏天的风” 博客,请务必保留此出处 http://shahdza.blog.51cto.com/2410787/1550089 手机的屏幕大小千差万别,如现在流行的安卓手机屏幕大部分长宽比 ...
- 两分钟让你明白cocos2dx的屏幕适配策略
闲来无事,整理了一下cocos2dx的屏幕适配策略,本文适用于想快速理解cocos2dx适配的开发者. 我们先假设:以854 * 480 的屏幕为标准进行开发,当然,这也就是cocos2dx所说的设计 ...
- Cocos2D-X屏幕适配新解
” 阅读器 为了适应移动终端的各种分辨率大小,各种屏幕宽高比,在 Cocos2D-X(当前稳定版:2.0.4) 中,提供了相应的解决方案,以方便我们在设计游戏时,能够更好的适应不同的环境. 而 ...
随机推荐
- python中的对象(三)
一.python对象 python使用对象模型来存储数据.构造任何类型的值都是一个对象. 所有python对象都拥有三个特性:身份.类型.值 身份:每个对象都有一个唯一的身份标识自己,任何对象的身份可 ...
- 返回xml过长时被nginx截断的解决办法
返回xml过长时被nginx截断的解决办法 问题描述:通过网页获取数据,数据格式为xml.当xml比较短时,可以正常获取数据.但是xml长度过长时不能正常获取数据,通过观察返回数据的源代码,发现xml ...
- postman接口测试——笔记
接口测试理论: 一.接口 1.程序内部接口:方法与方法之间,模块与模块之间的交互,程序内部抛出的接口,比如bbs系统,有登录模块,发帖模块等等,那你要发帖就必须先登录,那么这两个模块就得有交互,它 ...
- java和mysql之间的时间日期类型传递
摘自:http://blog.csdn.net/weinianjie1/article/details/6310770 MySQL(版本:5.1.50)的时间日期类型如下: datetime 8byt ...
- 01: MySql简介
MySQL其他篇 目录: 参考网站 1.1 数据库介绍 1.2 视图 1.3 触发器 1.4 事物 1.1 数据库介绍返回顶部 1.什么是数据库? 1. 数据库(Database)是按照数据结构来组织 ...
- 20145106 《Java程序设计》第8周学习总结
教材学习内容总结 NIO即New IO.对于高级输入/输出处理.java从JDK1.4开始提供了NIO,在JAVA SE 7 中又提供了NIO2,认识这些高级输入/输出处理API(Applicatio ...
- 20145227鄢曼君《网络对抗》Web基础
20145227鄢曼君<网络对抗>Web基础 实验内容 (1)Web前端HTML (2)Web前端javascipt (3)Web后端:MySQL基础:正常安装.启动MySQL,建库.创建 ...
- 20165310_Exp2实验三《敏捷开发与XP实践》
20165310 java_exp3 敏捷开发与XP实践 一.编码标准 编程标准包含:具有说明性的名字.清晰的表达式.直截了当的控制流.可读的代码和注释,以及在追求这些内容时一致地使用某些规则和惯用法 ...
- 《Python程序设计(第3版)》[美] 约翰·策勒(John Zelle) 第 1 章 答案
判断对错1.计算机科学是计算机的研究.2.CPU 是计算机的“大脑”.3.辅助存储器也称为 RAM.4.计算机当前正在处理的所有信息都存储在主存储器中.5.语言的语法是它的意思,语义是它的形式.6.函 ...
- BZOJ 1503 郁闷的出纳员(splay)
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1503 题意:给出一个数列(初始为空),给出一个最小值Min,当数列中的数字小于Min时自动 ...