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);
}
喔,找到你了吧!
好,下面认识一下吧:
Size _screenSize;
Size _designResolutionSize;
Rect _viewPortRect;
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);
}
float viewPortW = _designResolutionSize. width * _scaleX;
float viewPortH = _designResolutionSize. height * _scaleY;
_viewPortRect. setRect((_screenSize. width - viewPortW) / 2 , (_screenSize. height - viewPortH) / 2 , viewPortW, viewPortH);
auto director = Director::getInstance ();
director-> _winSizeInPoints = getDesignResolutionSize();
director-> createStatsLabel();
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 );
glview-> setDesignResolutionSize(1280 , 720 , ResolutionPolicy::NO_BORDER );
glview-> setDesignResolutionSize(1280 , 720 , ResolutionPolicy::SHOW_ALL );
glview-> setDesignResolutionSize(1280 , 720 , ResolutionPolicy::FIXED_HEIGHT );
glview-> setDesignResolutionSize(1280 , 720 , ResolutionPolicy::FIXED_WIDTH );
上面的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
大致就是这么个情况,如有不当之处,请留言指正!感激不尽。