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