在cocos2dx 2.0之后,Cocos2dx为不同分辨率手机提供了适配的方法,就是使用setDesignResolutionSize,一般情况下在AppDelegate.cpp文件中使用,如下:
auto director = Director::getInstance();
auto glview = director->getOpenGLView();
if(!glview) {
glview = GLView::create("MyGame");
director->setOpenGLView(glview);
}
glview->setDesignResolutionSize(320,480, kResolutionShowAll);
本文是基于Cocos2dx-3.2版本讲述,其他版本会有细微差别,在
setDesignResolutionSize方法中有五种适配方式:
EXACT_FIT
不进行缩放处理,保持设计尺寸,若手机分辨率和设计尺寸不匹配会出现黑边
NO_BORDER,
没有黑边的缩放方案,这样设计若宽高比不一样会出现图像被裁减问题
SHOW_ALL,
使用宽高较小因子放大,图像不会变形,但有可能出现黑边
FIXED_HEIGHT,
使用高的比例因子放大,但宽的设计尺寸有可能别更改
FIXED_WIDTH,
使用宽的比例因子放大,但高的设计尺寸有可能别更改
代码分析:
voidGLViewProtocol::setDesignResolutionSize(float width, float height,ResolutionPolicy resolutionPolicy)
{
if (width == 0.0f || height == 0.0f) {
return;
}
_designResolutionSize.setSize(width,height);//保存设计尺寸
_resolutionPolicy = resolutionPolicy;//匹配方案
updateDesignResolutionSize();
}
voidGLViewProtocol::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;//使用Y方向缩放因子
_designResolutionSize.width =
ceilf(_screenSize.width/_scaleX);//重新计算Width
}
else if ( _resolutionPolicy ==ResolutionPolicy::FIXED_WIDTH) {
_scaleY = _scaleX; //使用X方向缩放因子
_designResolutionSize.height = ceilf(_screenSize.height/_scaleY);//重新计算Height
}
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();//设置OpenGL视口,设置2D 3D相关属性
}
}