为什么屏幕适配,暂且不说,先看下目前手机的屏幕分辨率,如下:
480*800 // 比如windows phone以及中高端Android机
480*854 // WFVGA,是480*800的加长版
540*960 // HTC
640*960 // 经典版的iphone
1136*960 // iphone5
1280*720 // 传说中的HD
1280*800 // 三星的9220
1024*768 // ipad
如果我想让我的游戏在这些设备上运行,因为屏幕的不一致而设定多张不同的资源图片显示是不可取的,所以,屏幕适配是一个很好的方式。
在模拟器中,一般设定屏幕的大小,我们会使用main.cpp中:
CCEGLView* eglView = CCEGLView::sharedOpenGLView();
eglView->setFrameSize(960, 640); // 设定屏幕大小
然而,在程序中,假如,我有张480*320的图片,屏幕大小设定为960*640,其效果如下:
这样的效果,是不能满足要求的,所以在cocos2d-x的AppDelegate的AppDelegate::applicationDidFinishLaunching()中,我们可以添加如下代码:
CCEGLView* pEGLView = CCEGLView::sharedOpenGLView();
pEGLView->setDesignResolutionSize(float width, float height, ResolutionPolicy resolutionPolicy);
针对于setDesignResolutionSize,其,第一个和第二个参数为分辨率的宽高,第三个参数是适配模式,主要有以下几种:
kResolutionExactFit, // 拉伸变形,使其铺满屏幕
kResolutionNoBorder, // 按比例放缩,全屏展示不留黑边(长宽中小的铺满屏幕,大的超出屏幕)
kResolutionShowAll, // 按比例放缩,全部展示不裁剪(长宽中大的铺满屏幕,小的留有黑边)
kResolutionFixedHeight, // 按比例放缩,宽度铺满屏幕
kResolutionFixedWidth, // 按比例放缩,高度铺满屏幕
一般情况下,获取分辨率的宽高,我们会使用
CCDirector::sharedDirector()->getWinSize()获取分辨率的宽高
屏幕适配的原理,说通俗点讲就是获取屏幕宽高比率和背景图片宽高比率相对比的,所以我采取的方式是这样的:
// 屏幕适配(原理:根据屏幕比率和背景图片比率比较的大小)
ResolutionPolicy eResolutionType = kResolutionUnKnown; // 适配模式
CCSize winSize = CCSizeMake(480, 320);
float designRate = winSize.width / winSize.height; // 参照比率
float WinWidth = CCDirector::sharedDirector()->getWinSize().width;
float WinHeight = CCDirector::sharedDirector()->getWinSize().height;
float WinRate = WinWidth / WinHeight; // 屏幕比率
if (WinRate > designRate)
eResolutionType = kResolutionFixedWidth;
else if(WinRate < designRate)
eResolutionType = kResolutionFixedHeight;
else if(WinRate == designRate)
eResolutionType = kResolutionNoBorder;
pEGLView->setDesignResolutionSize(winSize.width, winSize.height, eResolutionType);
最后运行效果:
参考:http://blog.csdn.net/chinahaerbin/article/details/39586281
参考:http://my.oschina.net/ffs/blog/305680?fromerr=vvswf7WK