Cocos2d-x的屏幕适配

今天颇经过一番周折,算是弄明白了点儿cocos2d-x的屏幕适配,记之。

 

一切都从TestCpp开始,我在里面加了点儿自己的demo,跑起来发现如果窗口大小是原始480*320,那么跑起来没问题,可是窗口放大成1024*768,那么原始的demo都是按比例缩放,但我自己写的就还是原大小,导致了比例不对。开始以为是自己新写的某个类的问题,后来发现我在一个CCMenu里面加了多个MenuItem,一半用的现有资源,他们是对的,一半用的自己的新资源,他们是错的。这就没道理了,经过同事提醒,才发现诡异问题的根本原因是TestCpp准备了两套资源,除了我加的普通资源,还有个文件夹hd,里面放的是原始资源两倍大的高清资源,在高分辨率下,使用的是那套高清资源,我的新增资源因为只有一套,所以就不对了。

 

我们梳理了这部分代码,理解如下:

 

1.在pc上,main代码中,设置了eglView->setFrameSize(480, 320);这个setFrameSize是窗口大小的设置,最后viewport变换,设置到的就是这个尺寸。在ios的代码里面没有这一行,这是因为设备的framesize是根据设备本身的分辨率直接获取的,而不是设置的。

 

2.在appDelegate中,通过常量设置了designSize = CCSizeMake(480, 320);这是一个定值,就是页面进行设计时候的尺寸,比如如果我们有ccb,那么这个就是我们ccb设计时候的尺寸。

 

3.CCEGLView::sharedOpenGLView()->setDesignResolutionSize(designSize.width, designSize.height, kResolutionNoBorder);这句话就把设计的尺寸给设了进去(还有适配策略,在此略过),只要designsize是固定的并且在此设置,那么不管窗口尺寸通过上面的framesize怎么变化,cocos2d-x都会自己对整个画面进行缩放从而使所有的ui都等比例的变换,在不同设备看到不同效果。

 

4.我之所以遇到问题,是因为中间还有一段

    if (screenSize.height > 320)

    {

        CCSize resourceSize = CCSizeMake(960, 640);

        CCFileUtils::sharedFileUtils()->setResourceDirectory("hd");

        pDirector->setContentScaleFactor(resourceSize.height/designSize.height);

    }

大分辨率时我们进入了这一段。这里可以看到有个新的resourceSize,这个就是高清资源设计时所根据的尺寸,简单的说,和designSize一除就可以发现,是2倍。然后CCTexture2D等在getContentSize的时候会通过CC_CONTENT_SCALE_FACTOR宏将获得的资源尺寸除以这个值,也就是说原本400*300的资源,在高清下变成了800*600,然后除以2,又变回了400*300,从而可以适配在原来的ui中,正常显示。

 

posted @ 2013-07-10 22:06  unionfind  阅读(447)  评论(0编辑  收藏  举报