为何屏幕适配,暂且不说,先看下目前手机的屏幕分辨率,以下:windows
480*800 // 好比windows phone以及中高端Android机app
480*854 // WFVGA,是480*800的加长版iphone
540*960 // HTCspa
640*960 // 经典版的iphone.net
1136*960 // iphone5code
1280*720 // 传说中的HDblog
1280*800 // 三星的9220游戏
1024*768 // ipad图片
若是我想让个人游戏在这些设备上运行,由于屏幕的不一致而设定多张不一样的资源图片显示是不可取的,因此,屏幕适配是一个很好的方式。ip
在模拟器中,通常设定屏幕的大小,咱们会使用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