cocos2dx 2048源码 屏幕适配
一、引言
手机屏幕大小千差万别,如今流行的安卓手机屏幕大部分长宽比例为16:9,iPhone 5S的长宽比例为71:40(接近16:9),有预测称iPhone 6S的长宽比例也将是主流的16:9。此外,还有一些平板电脑的屏幕比例为4:3、16:10、5:4等。不同品牌的设备屏幕比例可能也各不相同。为了让程序在各种手机上都能完美呈现游戏画面,就需要进行屏幕适配。
二、屏幕适配相关概念
(一)两个分辨率
- 窗口分辨率
在
AppDelegate.cpp中有一个设置窗口分辨率的函数,该函数用于设置我们预想设备的屏幕大小,也就是应用程序窗口的大小。示例代码如下:glView->setFrameSize(480, 320); - 设计分辨率(可视区域)
同样在
AppDelegate.cpp中,有一个设置设计分辨率的函数。此函数设置的是我们在游戏设计时的分辨率,即可视区域的大小,也就是设计者初衷的游戏可视区域的分辨率屏幕大小。但对于每个用户而言,他们使用的设备不一定是(480/320)的,比如手机有大有小。而ResolutionPolicy::SHOW_ALL的含义是按照原比例(480/320)进行放缩以适配实际屏幕大小。示例代码如下:glview->setDesignResolutionSize(480, 320, ResolutionPolicy::SHOW_ALL);
为了加深理解,下面给出三张对比图:
- (1)原图片大小,窗口大小为480 * 320。
- (2)若设置窗口大小为
setFrameSize(960, 640),而不设置设计分辨率ResolutionPolicy::SHOW_ALL的情况下,图片不放缩,原图还是480 * 320。 - (3)设置了
ResolutionPolicy::SHOW_ALL之后,图片放缩到适配整个屏幕960 * 640 。
(二)五种适配模式
从上述讲解可知,setFrameSize()用于设置窗口大小(即屏幕的实际大小),该参数仅在开发时作为模拟参照,在实际手机上运行时,手机的屏幕大小是无法设置的。而屏幕适配的关键在于setDesignResolutionSize(),通过它可以设置可视区域的分辨率以及屏幕适配模式。该函数的前两个参数为分辨率(即屏幕长宽比例),最后一个参数则是适配的模式。
- 适配模式
ResolutionPolicy::EXACT_FIT:拉伸变形,使铺满屏幕。ResolutionPolicy::NO_BORDER:按比例放缩,全屏展示不留黑边(长宽中小的铺满屏幕,大的超出屏幕)。ResolutionPolicy::SHOW_ALL:按比例放缩,全部展示不裁剪(长宽中大的铺满屏幕,小的留有黑边)。ResolutionPolicy::FIXED_WIDTH:按比例放缩,宽度铺满屏幕。ResolutionPolicy::FIXED_HEIGHT:按比例放缩,高度铺满屏幕。
- 计算方法
假设屏幕分辨率为(fWidth,fHeight),设计分辨率为(dWidth,dHeight),放缩因子:k1 = fWidth/dWidth ,k2 = fHeight/dHeight。则适配后的分辨率大小如下:
EXACT_FIT:( dWidth k1 ,dHeight k2 )NO_BORDER:( dWidth max(k1,k2) ,dHeight max(k1,k2) )SHOW_ALL:( dWidth min(k1,k2) ,dHeight min(k1,k2) )FIXED_WIDTH:( dWidth k1 ,dHeight k1 )FIXED_HEIGHT:( dWidth k2 ,dHeight k2 )
- 示例说明 屏幕大小为400 X 400,可视区域大小为480 X 320。可根据上面的计算方法进行深入理解。
(三)横竖换屏
Cocos2d-x开发的游戏,在手机上运行时,默认是横屏的。
- Android
在
AndroidManifest.xml文件中:android:screenOrientation = "landscape":横屏显示(默认)android:screenOrientation = "portrait":竖屏显示
- IOS
- (NSUInteger) supportedInterfaceOrientations{ //横屏显示 //return UIInterfaceOrientationMaskLandscape;
//竖屏显示 return UIInterfaceOrientationMaskPortrait; }
### (四)屏幕大小及坐标
- **WinSize**:屏幕大小
- **VisibleSize**:可视区域大小
- **VisibleOrigin**:可视区域的左下角坐标
获取这些值的代码示例如下:
Director::getInstance()->getWinSize(); Director::getInstance()->getVisibleSize(); Director::getInstance()->getVisibleOrigin();
通过上述内容,我们可以全面了解Cocos2d-x中2048源码的屏幕适配相关知识,包括分辨率设置、适配模式、横竖屏切换以及屏幕大小和坐标的获取等。