代码改变世界

cocos2d-x c++ (多种屏幕Android与iOS的适配原理)

2017-04-26 01:51  罗任德  阅读(1128)  评论(0编辑  收藏  举报

1、AppDelegate.cpp 文件中

bool AppDelegate::applicationDidFinishLaunching() {

    // initialize director

    auto director = Director::getInstance();

    auto glview = director->getOpenGLView();

    if(!glview) {

        glview = GLView::create("My Game");

        director->setOpenGLView(glview);

    }

    glview->setDesignResolutionSize(640960, ResolutionPolicy::SHOW_ALL);

    ……………………

}

 

       不能把setDesignResolutionSize放在if条件里,因为在Android端的时候是不进入if条件的,有另外的地方做了初始化。

参数说明:

ResolutionShowAll

等比例拉伸,直到宽度或高度达到屏幕的尺寸,但是:如果游戏的设计分辨率和设备的屏幕分辨率比率不同,最后会出现黑边。如果打算在黑边出填放别的精灵是无效的,因为等比缩放后,黑边的部分不会进行绘制。假如设计分辨率低于大部分设备分辨率,在忽略黑边的情况下,这种适配方式可以满足大部分设备,而我们后面改进的适配方案就是把留出来的黑边利用上。结论:无法使用,黑边出现不符合很多渠道和应用商店的规范。这个参数说的明白一点就是当我们等比率的扩大和缩小我们的图片资源的时候,最先和屏幕的宽或者是高相匹配后就不再拉伸另一边了,当资源图片的宽高比和设备的宽高比不同时肯定有黑边。

ResolutionExactFit

非等比例拉伸,图像拉伸到整个屏幕。但是:如果游戏的设计分辨率和设备的屏幕分辨率不同,最后游戏画面失真。结论:可以使用,但是效果很差。

ResolutionNoBorder

等比例拉伸,直到宽度或高度达到屏幕尺寸,且保证在另一方向上不会出现黑边。就是当我们等比率的扩大和缩小我们的图片资源的时候,当比率小的那一个边和设备的边重合时,比率大的那一个边就出去了,所以虽然不会留下黑边,但是有的图片资源出去了,也许我们写的某一个控件就出去了。

 

 

2、FrameSize:实际上就是设备的原始分辨率(实际屏幕的大小),开发环境中可以通过 glview->setFrameSize( ) 来设置设备的分辨率大小,当然也可以可以通过 glview->setFrameSize( ) 获取得到设备的分辨率;

(编程时设置游戏窗口的大小)

  WinSize:开发所设计的分辨率,即 setDesignResolutionSize( )方法中传入的前两个参数,通过Director::getInstance( )->getWinSize()获取;  VisibleSize:一定小于等于WinSize,即在WinSize范围之内,保持FrameSize宽高比的最大显示区域。  VisibleOrigin:在WinSize下被FrameSize截取的区域大小,即设计分辨率中与屏幕左下角对应的点。

 

3、常见android手机分辨率

4:3VGA     640*480 (Video Graphics Array)QVGA  320*240 (Quarter VGA)HVGA  480*320 (Half-size VGA)SVGA  800*600 (Super VGA)

5:3WVGA  800*480 (Wide VGA)

16:9FWVGA 854*480 (Full Wide VGA)HD        1920*1080 High DefinitionQHD     960*540

 

720p    1280*720  标清1080p  1920*1080 高清

手机:iphone 4/4s    960*640 (3:2)iphone5         1136*640小米1             854*480(FWVGA)小米2             1280*720

 

分辨率对应DPI"HVGA    mdpi"

"WVGA   hdpi ""FWVGA hdpi ""QHD      hdpi ""720P     xhdpi""1080P   xxhdpi "