cocos2dx的屏幕适配方案
常规做法:
pEGLView::sharedOpenGLView()->setDesignResolutionSize()
通过导演类调用OpenGl函数 设置屏幕的配置方案
里面接五个参数
KResolutionExactFit:拉伸变长宽比,全屏显示
kResolutionFixedHeight:不变长宽比(保持传入的设计分辨率高度不变,根据屏幕分辨率修正设计分辨率的宽度),全屏但是有一部分宽度不显示
kResolutionFixedWidth:不变长宽比(保持传入的设计分辨率宽度不变,根据屏幕分辨率修正设计分辨率的高度),全屏但是有一部分高度不显示
KResolutionNoBorder:不变长宽比(取Max(设计高度 / 实际高度, 设计宽度 / 实际宽度)的值作为缩放比例),全屏但是有一部分不显示
KResolutionShowAll:不变长宽比,有黑边
我们看看前辈们测试的demo:
以为这就已经问没解决问题了?
NONONO,对于以前那些老机子来说,确实可以解决问题了
但是现在手机换代越来越快,市面上推出了许许多多水滴屏,挖孔屏,刘海屏等奇奇怪怪的屏幕
这个时候我们就得更灵活的去处理问题了,不然你好好的一个充值按钮被刘海给挡住了,那直接举双手GG。
我们可以采取以下的方法解决问题:
1.从设计开始避免,把重要的信息,按钮不要摆放到太靠边的位置。
我们之后做的适配都是为了解决因为刘海屏,水滴屏而造成的游戏体验不好或者影响游戏操作的问题。那么既然如此为什么不从设计开始避免这些问题的出现呢?
2.一般采用下图这种适配方案:
- 1.IOS苹果手机因为机型类型比较少,所以游戏正文所占屏幕区域的宽高比(safeArea)我们可以直接配置,比如["iPhone Xs"] = 2、["iPhone Xs Max"] = 2。
- 2.安卓机器机型比较多而杂,无法通过配置写死safeArea,所以通过代码取得,指的一提的是安卓9.0以下的时候没有统一的获取方式,华为 oppo Vivo 小米需要各自厂商不同的接口分别获取,安卓9.0以上可以统一获取。(具体可自行百度或者参考AppActivity.java)
取得safeArea以后:
如果界面不需要适配,需要全屏显示。比如有的背景界面需要在刘海区域显示,就需要将界面左移回来,并设置contentSize大小为realSizelocal safeWidth = realHeight * safeArea (游戏正文宽度) local offset = (realWidth - safeWidth)/2 (左右刘海宽度) g_UIMainSceneLayer:setPositionX(offset) (将所有界面的父节点 右移offset) local safeSize = cc.size(safeWidth,realHeight) g_UIMainSceneLayer:setContentSize(safeSize) (设置contentSize为正文大小)