cocos屏幕大小修改适配流程理解 - pxqwxl/myLearnPoject GitHub Wiki

cocos屏幕适配中主要涉及3个分辨率 1.screenSize 即当前屏幕大小 可以使用setFrameSize修改 2.winSize 即经过设计分辨率和适配方案转化后的屏幕大小 3.DesignResolutionSize 即设计分辨率

设计分辨率为开发阶段规定的数值 当屏幕大小发生变化时 1.首先我们把screenSize设置为当前屏幕大小 2.设置适配方案以及设计分辨率 此时 cocos 利用设计分辨率和适配方案 对screensize进行修正 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;`
	`CCLOG("size========_screenSize.width - viewPortW,%f,_screenSize.height - viewPortH %f  viewPortW %f  viewPortH %f", (_screenSize.width - viewPortW) / 2, (_screenSize.height - viewPortH) / 2, viewPortW, viewPortH);`

    `_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();`
	`CCLOG("size========width,%f,height %f _screenSize.width %f _screenSize.height %f", director->_winSizeInPoints.width, director->_winSizeInPoints.height, _screenSize.width, _screenSize.height);`
    `director->_isStatusLabelUpdated = true;`
    `director->setGLDefaultValues();`
`}`

} 4.随后在director->setGLDefaultValues()方法中调用setProjection(_projection);设置视口并对winsize进行复制 5.调用后 将适配后的屏幕大小通过 createOrthographicOffCenter方法对opengl显示内容进行转化缩放等操作 注 当修改完屏幕大小后 当前屏幕的界面并不能重新适配 因为当前的屏幕各个元素的contentsize以及position已经设定过了没有进行转换