cocos2dx 2048源码 屏幕适配

2015年03月04日 09:51 0 点赞 0 评论 更新于 2025-11-21 16:39

一、引言

手机屏幕大小千差万别,如今流行的安卓手机屏幕大部分长宽比例为16:9,iPhone 5S的长宽比例为71:40(接近16:9),有预测称iPhone 6S的长宽比例也将是主流的16:9。此外,还有一些平板电脑的屏幕比例为4:3、16:10、5:4等。不同品牌的设备屏幕比例可能也各不相同。为了让程序在各种手机上都能完美呈现游戏画面,就需要进行屏幕适配。

二、屏幕适配相关概念

(一)两个分辨率

  1. 窗口分辨率AppDelegate.cpp中有一个设置窗口分辨率的函数,该函数用于设置我们预想设备的屏幕大小,也就是应用程序窗口的大小。示例代码如下:
    glView->setFrameSize(480, 320);
    
  2. 设计分辨率(可视区域) 同样在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(),通过它可以设置可视区域的分辨率以及屏幕适配模式。该函数的前两个参数为分辨率(即屏幕长宽比例),最后一个参数则是适配的模式。

  1. 适配模式
    • ResolutionPolicy::EXACT_FIT:拉伸变形,使铺满屏幕。
    • ResolutionPolicy::NO_BORDER:按比例放缩,全屏展示不留黑边(长宽中小的铺满屏幕,大的超出屏幕)。
    • ResolutionPolicy::SHOW_ALL:按比例放缩,全部展示不裁剪(长宽中大的铺满屏幕,小的留有黑边)。
    • ResolutionPolicy::FIXED_WIDTH:按比例放缩,宽度铺满屏幕。
    • ResolutionPolicy::FIXED_HEIGHT:按比例放缩,高度铺满屏幕。
  2. 计算方法 假设屏幕分辨率为(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 )
  3. 示例说明 屏幕大小为400 X 400,可视区域大小为480 X 320。可根据上面的计算方法进行深入理解。

(三)横竖换屏

Cocos2d-x开发的游戏,在手机上运行时,默认是横屏的。

  1. AndroidAndroidManifest.xml文件中:
    • android:screenOrientation = "landscape" :横屏显示(默认)
    • android:screenOrientation = "portrait" :竖屏显示
  2. IOS
    - (NSUInteger) supportedInterfaceOrientations{
    //横屏显示
    //return UIInterfaceOrientationMaskLandscape;
    

//竖屏显示 return UIInterfaceOrientationMaskPortrait; }


### (四)屏幕大小及坐标
- **WinSize**:屏幕大小
- **VisibleSize**:可视区域大小
- **VisibleOrigin**:可视区域的左下角坐标

获取这些值的代码示例如下:

Director::getInstance()->getWinSize(); Director::getInstance()->getVisibleSize(); Director::getInstance()->getVisibleOrigin();


通过上述内容,我们可以全面了解Cocos2d-x中2048源码的屏幕适配相关知识,包括分辨率设置、适配模式、横竖屏切换以及屏幕大小和坐标的获取等。

作者信息

boke

boke

共发布了 3994 篇文章