Cocos2d-x的屏幕适配
2013-07-10 22:06
351 查看
今天颇经过一番周折,算是弄明白了点儿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中,正常显示。
一切都从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中,正常显示。
相关文章推荐
- cocos2d-x 屏幕适配新解(比较全面比较详细)
- cocos2d-x 简单屏幕适配
- [转]cocos2d-js 3.0 屏幕适配方案 分辨率适应
- cocos2d-x学习之路(14)--屏幕适配
- cocos2d-x 屏幕适配方案
- cocos2d-x屏幕适配原理分析
- Cocos2d-x之VS2012屏幕及适配问题
- cocos2d-x学习之屏幕适配问题
- Cocos2d-x3.5屏幕适配
- cocos2d-x屏幕适配原理分析
- Cocos2d-x 屏幕适配详解
- cocos2d 3.0 屏幕适配
- cocos2d-x-lua的屏幕适配
- cocos2d-x 地图移动 屏幕适配
- Cocos2d-x 屏幕适配新解
- [cocos2d-x]关于屏幕适配
- Cocos2d-x 屏幕适配新解
- 【HIMI转载推荐之二】Cocos2d-x 屏幕适配新解(比较全面比较详细)
- Cocos2d-x屏幕适配之Sprite绘制原理
- Cocos2D-X屏幕适配新解