今天颇经过一番周折,算是弄明白了点儿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);
}