cocos2d-x项目快速适配IPAD的方法
最近在做项目的时候,要把原来cocos2d-x做的游戏适配到IPAD上做成universal版。为快速适配,只作了以下要求:
使用原iphone版HD资源(960*640),不用适配到1024*768,四周可留黑边
不改动原有逻辑代码
这里分享一下我的经验,希望对项目中也有这种需求的朋友有点帮助。
cocos2d-x默认在IPAD模式下是按照1024*768处理的,所以如果你的iphone项目只是按照480*320和960*640两种分辨率来做的,而在逻辑中也没有采用相对坐标设置UI的话。在IPAD上你的项目很可能UI就全乱掉了,而且只能加载SD资源,无法加载HD资源。
所以我第一想法是让cocos2d-x认为这是个开启retina设置的程序,这样应该就可以达到目的。
在IPAD下你会发现enableRetinaDisplay不起做用。在cocos2d-x源码中的CCDirector:: enableRetinaDisplay会发现这段代码
// setContentScaleFactor is not supported
if (! m_pobOpenGLView->canSetContentScaleFactor())
{
return false;
}
在这里IPAD下会返回false,也就是不支持ContentScaleFactor。所以现在要做的是强行让这个函数返回true。修改canSetContentScaleFactor函数的源码。
原始代码:
bool CCEGLView::canSetContentScaleFactor()
{
return [[EAGLView sharedEGLView] respondsToSelector:@selector(setContentScaleFactor:)]
&& [[UIScreen mainScreen] scale] != 1.0;
}
修改成
bool CCEGLView::canSetContentScaleFactor()
{
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) return true;//if ipad return true
return [[EAGLView sharedEGLView] respondsToSelector:@selector(setContentScaleFactor:)]
&& [[UIScreen mainScreen] scale] != 1.0;
}
改了这个函数后,启用enableRetinaDisplay应该就可以加载HD资源了。
但是这还不够,分辨率还是按照1024*768处理的。我们得处理下用的EAGLView
打开工程下ios目录下的AppController.mm,找到这段
window = [[UIWindow alloc] initWithFrame: [[UIScreen mainScreen] bounds]];
EAGLView *__glView = nil;
__glView = [EAGLView viewWithFrame: [window bounds]
pixelFormat: kEAGLColorFormatRGBA8
depthFormat: GL_DEPTH_COMPONENT16_OES
preserveBackbuffer: NO
sharegroup: nil
multiSampling: NO
numberOfSamples: 0 ];
这里不能直接用mainScreen的大小,修改成这样:
window = [[UIWindow alloc] initWithFrame: [[UIScreen mainScreen] bounds]];
EAGLView *__glView = nil;
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {//这里按照横屏设置修改的,如竖屏更改下宽高
__glView = [EAGLView viewWithFrame: CGRectMake(0, 0, 480, 320)
pixelFormat: kEAGLColorFormatRGBA8
depthFormat: GL_DEPTH_COMPONENT16_OES
preserveBackbuffer: NO
sharegroup: nil
multiSampling: NO
numberOfSamples: 0 ];
__glView.transform = CGAffineTransformMakeScale(2.0, 2.0);
__glView.frame = CGRectMake((1024-960)/2, (768-640)/2, 960, 640);
}
else {
__glView = [EAGLView viewWithFrame: [window bounds]
pixelFormat: kEAGLColorFormatRGBA8
depthFormat: GL_DEPTH_COMPONENT16_OES
preserveBackbuffer: NO
sharegroup: nil
multiSampling: NO
numberOfSamples: 0 ];
}
这两处修改后就大功告成了。看看游戏是不是以HD资源跑在IPAD中央了呢?
这种改法不用更改原有游戏逻辑代码,但是如果要做到真正1024*768完全适配还得在编写逻辑的时候注意UI坐标的相对性。
让Cocos2d-x实现全屏等比缩放适配Android各种分辨率:
代码控制很简单,代码获取触摸屏上下左右和斜方向和屏幕边缘相交的8个点+中心点的坐标位置作为定位点,所有血条等UI元素根据9个定位点在屏幕内定位。这样就可以了。