没有最好的适配方案,适配是根据游戏而制定了。
目前正在做的项目需要一个适配适配方案,由于之前一直没有更深入的去写适配,只是简单的写了写。能运行在iphone,4,5上和安卓1280上,但那都是用多套图来实现的。那些项目也都是自己写的一些小项目。以成熟的项目来说,多套图是应该的,但是也不是一个比例屏一套图。我想记录现在的想法以便以后自己观看。
首先例出些市面上常有的屏幕比例
//常用机型比例如下。
//1280:720 1920:1080 2460:1440 960:540 1.77777~
//1136:640 1.775
//854:480 1.779~
//800:480 1800:1080 1.66666~
//1280:800 1.6
//960:640 1.5
//1024:768 2048:1536 1.333333~
这里可以看出,目前市面上的机型屏幕比例都是在1.77777~ 到1.33333~之间。除去高清屏外,最大的宽是1280,最大的高是
800。对此我需要找一套标准的基准的屏幕尺寸来参考设计游戏内容并进行画图。由于我目前的项目内容不能拉伸,我也只能假定不能拉伸来解决此适配问题。
现在我们以不能拉升的角度来看。既然不能拉伸,为了保证图片的一定显示质量,毕竟大屏的手机较多,那么这里就选取1280的宽。和768的高,为什么不选取800呢?原因有很多,因为要适配ipad。768的图可以直接显示。最主要是最大的不一定放大比例最好。目前我们就假定选取768为高。好,下面看一组数据。
list.push_back(CCSize(1136, 640));
list.push_back(CCSize(1024, 768));
list.push_back(CCSize(1280, 720));
list.push_back(CCSize(800, 480));
list.push_back(CCSize(854, 480));
list.push_back(CCSize(960, 540));
list.push_back(CCSize(2048, 1536));
list.push_back(CCSize(1800, 1080));
list.push_back(CCSize(2460, 1440));
这是一组目前市面上较常见的比例。把这些比例缩小到宽只有1280,但是要保证高要小于768,如果大于768,要保证高等于768,而宽要小于1280.比例等放后如下。
Cocos2d: w:1280 h:721
Cocos2d: w:1024 h:768
Cocos2d: w:1280 h:720
Cocos2d: w:1280 h:768
Cocos2d: w:1280 h:719
Cocos2d: w:1280 h:720
Cocos2d: w:1024 h:768
Cocos2d: w:1280 h:768
Cocos2d: w:1280 h:749
现在看明白了吧?不管你的比例是多少,都按照1280和768的大小进行等比放大缩小。最后得到两个最小值。1024和719,换算得出这个可设计区域,也就是说图是1280*768的大小,但是百分之百不会被裁剪的区域大小为1024*719,也就是说宽有%20是装饰,高有%93为装饰,设计游戏内容的时候一定要在这个区域内显示就行了。
当然最后一点,这个图,必须是居中显示。如果想支持高清屏可以出对象的高清图。目前这种做法就是一套图走天下,那么缺点也是可见了。可用区域宽有80%高有%93。
目前我对此种方案是比较满意的,之后会试试不用1280,用1.5的比例来试试。
最后还是那句话,没有最好的适配,只有最适合当前游戏的适配。
今天2014年2月11.
libpng warning: iCCP: known incorrect sRGB profile
cocos2d: w:985 h:554
cocos2d: w:853 h:640
cocos2d: w:985 h:554
cocos2d: w:985 h:591
cocos2d: w:985 h:553
cocos2d: w:984 h:554
cocos2d: w:853 h:640
cocos2d: w:984 h:591
cocos2d: w:985 h:576
cocos2d: w:985 h:554
cocos2d: bl w:0.865112 h:0.865625
采用 h:986 w:640 这个空旷比例都为13.5%。感觉比较合适,在此做记录。
测试代码
Size fSize = director->getOpenGLView()->getFrameSize();
std::vector<Size> list;
list.push_back(Size(1136, 640));
list.push_back(Size(1024, 768));
list.push_back(Size(1280, 720));
list.push_back(Size(800, 480));
list.push_back(Size(854, 480));
list.push_back(Size(960, 540));
list.push_back(Size(2048, 1536));
list.push_back(Size(1800, 1080));
list.push_back(Size(2460, 1440));
list.push_back(Size(fSize));
float zw = 985;
float zh = 640;
int w = zw;
int h = zh;
int minW = w;
int minH = h;
for (int i = 0; i < list.size(); i++) {
Size size = list[i];
while(size.width>zw||size.height>zh){
size.width = size.width/2.0f;
size.height = size.height/2.0f;
}
float wv = zw/size.width;
float hv = zh/size.height;
float min = wv>hv?hv:wv;
w = (int)(size.width * min);
minW = w <minW?w:minW;
h = (int)(size.height * min);
minH = h < minH ? h : minH;
CCLOG(" w:%d h:%d",w,h);
}
CCLOG(" bl w:%f h:%f",minW/zw,minH/zh);