cocos2d-x 3.x(回头巩固基础知识之分辨率的适配(上))
来源:互联网 发布:php 异步http请求 编辑:程序博客网 时间:2024/06/01 09:57
1.AppDelegate::applicationDidFinishLaunching())
这家伙相信大家都很熟悉。没错,分辨率的设置也就是在这里进行的。由于本人水平有限,对与OpenGL()不甚了解。所以只说分辨率的问题,所以只说分辨率的问题,所以只说分辨率的问题。重要的事情说三遍。
所以直接跳到第三句:
if(!glview) { glview = GLViewImpl::create("My Game"); director->setOpenGLView(glview);}
其他的不管,说好了只说分辨率(旁白:看的出来水平真的有限!嘿嘿)。
glview = GLViewImpl::create("My Game");
就是这一句,到底做了什么从实招来。撬动您的弹指神功F12进去:
GLViewImpl* GLViewImpl::create(const std::string& viewName){ auto ret = new (std::nothrow) GLViewImpl; if(ret && ret->initWithRect(viewName, Rect(0, 0, 960, 640), 1)) { ret->autorelease(); return ret; } return nullptr;}
这是?我再弹:
bool GLViewImpl::initWithRect(const std::string& viewName, Rect rect, float frameZoomFactor){ setViewName(viewName); ... setFrameSize(rect.size.width, rect.size.height); ... return true;}
好多东西有不有?但是我只看懂两句(好吧!也就这样了!)
连弹两下:
void GLView::setFrameSize(float width, float height){ _designResolutionSize = _screenSize = Size(width, height);}
喔,找到你了吧!
好,下面认识一下吧:
// real screen size(通俗点就是屏幕大小getFrameSize(),获取窗口的大小) // setFrameSize这个函数是设置设备屏幕分辨率--窗口大小的(真机中不用设置此项) Size _screenSize; // resolution size, it is the size appropriate for the app resources.(游戏作者设计的画面大小getWinSize(),只是设计游戏的场景大小,一般是不变的。) Size _designResolutionSize; // the view port size(视口大小(OpenGL渲染的窗口大小)) Rect _viewPortRect; // (没错 EXACT_FIT,NO_BORDER,SHOW_ALL,FIXED_HEIGHT,FIXED_WIDTH,UNKNOWN,被ResolutionPolicy这个家伙收购了(收购了?)。) ResolutionPolicy _resolutionPolicy;
2. CCGLView.cpp
既然来了,就多坐一会儿吧。
先泡杯茶欣赏一下眼前的三处风景:
void GLView::setFrameSize(float width, float height){ _designResolutionSize = _screenSize = Size(width, height);}
void GLView::setDesignResolutionSize(float width, float height, ResolutionPolicy resolutionPolicy){ ... _designResolutionSize.setSize(width, height); _resolutionPolicy = resolutionPolicy; updateDesignResolutionSize(); }
void GLView::updateDesignResolutionSize(){ if (_screenSize.width > 0 && _screenSize.height > 0 && _designResolutionSize.width > 0 && _designResolutionSize.height > 0) { _scaleX = (float)_screenSize.width / _designResolutionSize.width; _scaleY = (float)_screenSize.height / _designResolutionSize.height; if (_resolutionPolicy == ResolutionPolicy::NO_BORDER) { _scaleX = _scaleY = MAX(_scaleX, _scaleY); } else if (_resolutionPolicy == ResolutionPolicy::SHOW_ALL) { _scaleX = _scaleY = MIN(_scaleX, _scaleY); } else if ( _resolutionPolicy == ResolutionPolicy::FIXED_HEIGHT) { _scaleX = _scaleY; _designResolutionSize.width = ceilf(_screenSize.width/_scaleX); } else if ( _resolutionPolicy == ResolutionPolicy::FIXED_WIDTH) { _scaleY = _scaleX; _designResolutionSize.height = ceilf(_screenSize.height/_scaleY); } // calculate the rect of viewport float viewPortW = _designResolutionSize.width * _scaleX; float viewPortH = _designResolutionSize.height * _scaleY; _viewPortRect.setRect((_screenSize.width - viewPortW) / 2, (_screenSize.height - viewPortH) / 2, viewPortW, viewPortH); // reset director's member variables to fit visible rect auto director = Director::getInstance(); director->_winSizeInPoints = getDesignResolutionSize(); director->createStatsLabel(); //看这里,就是这里,进行5指神弹 director->setGLDefaultValues(); }}
//弹到了这里,到底弹了几下?void Director::setViewport(){ if (_openGLView) { _openGLView->setViewPortInPoints(0, 0, _winSizeInPoints.width, _winSizeInPoints.height); }}//对视口(渲染的窗口进行了重新设置),不相信可以弹进去看一下。
3. 以上就是今天的全部内容了(what?)
4.下面请看内容提要:
渲染了一个窗口(不管它是怎么渲染的…),create()以后
通过setFrameSize()
函数,得到了_designResolutionSize 和 _screenSize的大小
接着
director->setOpenGLView(glview);
设置了视口(渲染窗口的大小)。不信可以弹进去找找(里面真是乐趣无穷!嘿嘿)
下面就是屏幕适配的了
glview->setDesignResolutionSize(1280, 720, ResolutionPolicy::EXACT_FIT); //androidglview->setDesignResolutionSize(1280, 720, ResolutionPolicy::NO_BORDER); //androidglview->setDesignResolutionSize(1280, 720, ResolutionPolicy::SHOW_ALL); //androidglview->setDesignResolutionSize(1280, 720, ResolutionPolicy::FIXED_HEIGHT); //androidglview->setDesignResolutionSize(1280, 720, ResolutionPolicy::FIXED_WIDTH); //android
上面的2中告诉我们,setDesignResolutionSize()函数适配以后,根据真机屏幕分辨率的大小进行相应的缩放以后,也改变了视口的大小(即渲染的窗口区域大小。)
由于选择的缩放方式不同,也有可能渲染的窗口大小超出屏幕大小显示范围,或者渲染的窗口大小小于屏幕大小出现黑边。
终于还是承认吧!表达的可能不是很清楚。
最后总结:
理清3个概念:
1.屏幕大小(setFrameSize(),getFrameSize())
2.游戏场景设计大小(setDesignResolutionSize(1280,720,ResolutionPolicy::NO_BORDER))
3.视口大小,即OpenGL渲染的窗口大小(例如:通过setDesignResolutionSize()函数,根据ResolutionPolicy::NO_BORDER的适配模式,计算相应缩放比,重置渲染的窗口大小)
举个现实的例子:
放电影的过程中用到的三部分:
1.电影布:(屏幕大小)
2.胶卷录制的内容大小:(游戏场景设计大小)
3.根据一定的比例通过投影仪将胶卷中的内容投影到影布的大小:(视口大小)
4.然后你想在电影布上放多大的窗口,就放多大的窗口吧!不过不要忘了,几个已经被设置好的模式EXACT_FIT,NO_BORDER,SHOW_ALL,FIXED_HEIGHT,FIXED_WIDTH
大致就是这么个情况,如有不当之处,请留言指正!感激不尽。
0 0
- cocos2d-x 3.x(回头巩固基础知识之分辨率的适配(上))
- cocos2d-x 3.x(回头巩固基础知识之分辨率的适配(下))
- [Cocos2D-X官方文档]:Cocos2d-x分辨率的适配
- cocos2d-x 之 适配分辨率全屏的方法
- cocos2d-x 之 适配分辨率全屏的方法
- cocos2d-x 3.X 多分辨率适配
- cocos2d-x android多分辨率适配
- Cocos2d-x 多分辨率屏幕适配
- 04.cocos2d-x多分辨率适配
- Cocos2d-x之多分辨率屏幕适配
- 【Cocos2d-x v3.x官方文档】Cocos2d-x 多分辨率适配完全解析
- 【Cocos2d-x v3.x官方文档】Cocos2d-x 多分辨率适配完全解析
- 【Cocos2d-x v3.x官方文档】Cocos2d-x 多分辨率适配完全解析
- cocos2d-x 笔记(二) 多分辨率完美适配的方法
- cocos2d-x适配多分辨率
- cocos2d-x适配多分辨率
- cocos2d-x分辨率自适应
- cocos2d-x多分辨率
- 服务器配置PPTP-VNP
- CAC Shadowsocks+锐速破解版搭建(转载+原创)
- 回看2016,OVM免费虚拟化迭代历程分享!
- 王桂林讲C++之指向类成员指针
- 带有回弹的ScrollView支持左右惯性。
- cocos2d-x 3.x(回头巩固基础知识之分辨率的适配(上))
- Java的transient关键字
- 来来。挑战下。看谁截屏能把他们三个都复位
- WordPress网站robots怎么写
- ubuntu14.04 LTS 下vsftpd安装配置
- Android Studio 掌握这些调试技巧
- 自定义的顶部标题栏
- jquery带动画的二级下拉列表
- 一个简单的信号量