a. 几种适配模式
1. kResolutionUnKnown无模式,会出现各种奇怪的问题,一般不采用这个
2. kResolutionExactFit
游戏画面宽高都完全适配手机屏幕尺寸
优点:游戏画面完全适配手机屏幕,使用方便
缺点:画面变形,画质损失
3. kResolutionFixedHeight
游戏画面高度完全适配手机屏幕高度
缺点:游戏画面过宽时会出现移出屏幕外的情况
游戏画面过窄时会出现黑边的情况
4. kResolutionFixedWidth
同上,只是把高度改成宽度
5. kResolutionNoBorder
优点:画面全部展示且不会出现黑边
缺点:游戏画面将有一份露出屏幕之外
6. kResolutionShowAll
优点:游戏画面全部展示
缺点:游戏画面会出现黑边
b. 最佳解决方案
kResolutionNoBorder和kResolutionShowAll两个模式结合,取各自的优点1. 游戏画面全部展示
2. 游戏画面不会出现黑边
3. 游戏画面不会有露出屏幕之外情况
c. 几个尺寸概念
1. frameSize : 手机屏幕尺寸大小CCSize frameSize = Director::getInstance()->getOpenGLView()->getFrameSize();
2. winSize : 游戏设计尺寸大小
CCSize winSize = Director::getInstance()->getWinSize();
3. lsSize : 游戏在手机屏幕上显示的可见区域
是winSize的等比例缩小
d. 具体代码
//手机尺寸大小CCSize frameSize = CCEGLView::sharedOpenGLView()->getFrameSize();
//游戏在手机屏幕上显示的可见区域, 这里假设480*800
CCSize lsSize = CCSizeMake(480, 800);
//屏幕尺寸和显示尺寸比值
float scaleX = (float) frameSize.width / lsSize.width;
float scaleY = (float) frameSize.height / lsSize.height;
//定义 scale 变量,取比值偏大的一个作为放大值
float scale = 0.0f;
if (scaleX > scaleY) {
scale = scaleX / (frameSize.height / (float) lsSize.height);
} else {
scale = scaleY / (frameSize.width / (float) lsSize.width);
}
//游戏设计尺寸大小, 屏幕坐标也是根据这个而来
CCEGLView::sharedOpenGLView()->setDesignResolutionSize(lsSize.width * scale,
lsSize.height * scale, kResolutionNoBorder);
PS: 这个地址有更详细的介绍 http://www.cocoachina.com/game/20130513/6180.html