cocos2d-x 3.x(回头巩固基础知识之分辨率的适配(上))

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);        //android
glview->setDesignResolutionSize(1280, 720, ResolutionPolicy::NO_BORDER);        //android
glview->setDesignResolutionSize(1280, 720, ResolutionPolicy::SHOW_ALL);     //android
glview->setDesignResolutionSize(1280, 720, ResolutionPolicy::FIXED_HEIGHT);     //android
glview->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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值