@H_403_3@
@H_403_3@Cocos2d-x 完美适配iphone、ipad(包括retina模式)@H_403_3@
@H_403_3@猴子原创,欢迎转载。转载请注明:@H_403_3@转载自Cocos2D开发网--Cocos2Dev.com@H_403_3@,谢谢!@H_403_3@@H_403_3@
@H_403_3@原文地址:http://www.Cocos2dev.com/?p=245@H_403_3@@H_403_3@@H_403_3@
@H_403_3@项目中需要同时适配iphone@H_403_3@和ipad@H_403_3@。美术提供的iphone@H_403_3@的图是640x960@H_403_3@的,ipad@H_403_3@的图是768x1024@H_403_3@的。发布的时候,项目肯定会分开发布iphone@H_403_3@版和ipad@H_403_3@版,但是开发过程中,我需要看到ipad@H_403_3@上的效果,所以开发过程中不可能分开。@H_403_3@@H_403_3@
@H_403_3@联想到高低清可以用-hd@H_403_3@后缀区分,我就想到将所有ipad@H_403_3@的768x1024@H_403_3@图后面全部加-ipad@H_403_3@后缀,程序中在ipad@H_403_3@上就让它加载-ipad@H_403_3@后缀的图。@H_403_3@@H_403_3@
@H_403_3@现在来看看我的实现:(主要模仿的-hd@H_403_3@的实现方式)@H_403_3@@H_403_3@
@H_403_3@1@H_403_3@、首先宏定义 -ipad@H_403_3@@H_403_3@@H_403_3@
@H_403_3@找到libs/Cocos2dx/include/ccConfig.h@H_403_3@,加入宏定义代码:@H_403_3@@H_403_3@
@H_403_3@@H_403_3@@H_403_3@#ifndef CC_IPAD_DISPLAY_FILENAME_SUFFIX
#define CC_IPAD_DISPLAY_FILENAME_SUFFIX "-ipad"
#endif
@H_403_3@
@H_403_3@
2@H_403_3@、修改底层读取文件的地方,如果是ipad@H_403_3@设备就添加后缀-ipad@H_403_3@@H_403_3@@H_403_3@
@H_403_3@打开libs/Cocos2dx/platform/ios/CCFileUtils_ios.mm@H_403_3@文件@H_403_3@@H_403_3@
@H_403_3@ @H_403_3@static const char *static_ccRemoveHDSuffixFromFile( const char *pszPath){ #if CC_IS_RETINA_DISPLAY_SUPPORTED if(cocos2d::CC_CONTENT_SCALE_FACTOR() == 2 ) { //........ } //这里添加下面的代码:支持ipad图片 ------开始-------- if( UI_USER_INTERFACE_IdioM() ==UIUserInterfaceIdiomPad){ NSString *path = [NSString stringWithUTF8String: pszPath]; NSString *name = [path lastPathComponent]; NSString *suffix = [NSString stringWithUTF8String: CC_IPAD_DISPLAY_FILENAME_SUFFIX]; // check if path already has the suffix. if( [name rangeOfString: suffix].location != NSNotFound ) { CCLOG("cocos2d: Filename(%@) contains %@ suffix. Removing it. See cocos2d issue #1040",path,CC_RETINA_DISPLAY_FILENAME_SUFFIX); NSString *newLastname = [name stringByReplacingOccurrencesOfString: suffix withString:@""]; NSString *pathWithoutLastname = [path stringByDeletingLastPathComponent]; return [[pathWithoutLastname stringByAppendingPathComponent:newLastname] UTF8String]; } } //支持ipad图片 ------结束-------- #endif // CC_IS_RETINA_DISPLAY_SUPPORTED };
@H_403_3@ @H_403_3@ @H_403_3@
static NSString* getDoubleResolutionImage(NSString* path) { #if CC_IS_RETINA_DISPLAY_SUPPORTED if( cocos2d::CC_CONTENT_SCALE_FACTOR() == 2 ) { //....... } //这里添加支持ipad图片。--------开始---------- if( UI_USER_INTERFACE_IdioM() ==UIUserInterfaceIdiomPad ) { NSString *pathWithoutExtension = [path stringByDeletingPathExtension]; NSString *name = [pathWithoutExtension lastPathComponent]; NSString *suffix = [NSString stringWithUTF8String: CC_IPAD_DISPLAY_FILENAME_SUFFIX]; // check if path already has the suffix. if( [name rangeOfString: suffix].location != NSNotFound ) { CCLOG("cocos2d: WARNING Filename(%@) already has the suffix %@. Using it.",name,CC_RETINA_DISPLAY_FILENAME_SUFFIX); return path; } NSString *extension = [path pathExtension]; if( [extension isEqualToString:@"ccz"] || [extension isEqualToString:@"gz"] ) { // All ccz / gz files should be in the format filename.xxx.ccz // so we need to pull off the .xxx part of the extension as well extension = [NSString stringWithFormat:@"%@.%@",[pathWithoutExtension pathExtension],extension]; pathWithoutExtension = [pathWithoutExtension stringByDeletingPathExtension]; } NSString *retinaName = [pathWithoutExtension stringByAppendingString: suffix]; retinaName = [retinaName stringByAppendingPathExtension:extension]; NSFileManager *fileManager = [[[NSFileManager alloc] init] autorelease]; if( [fileManager fileExistsAtPath:retinaName] ) return retinaName; CCLOG("cocos2d: CCFileUtils: Warning HD file not found: %@",[retinaName lastPathComponent] ); } //这里添加支持ipad图片。--------结束---------- #endif // CC_IS_RETINA_DISPLAY_SUPPORTED return path; }
@H_403_3@
可能你注意到了,我只是修改了里面的宏定义,所以并不需要写两个函数,跋宏定义拿出来,修改下就可以。我为了不动引擎自己的代码,就在下面写了一份。@H_403_3@
@H_403_3@ @H_403_3@3@H_403_3@、将iOSApplication Target @H_403_3@中的Devices@H_403_3@改成Universal@H_403_3@。@H_403_3@
@H_403_3@4@H_403_3@、运行看看,如果你修改的是helloworld@H_403_3@工程,那么请将HelloWorld.png@H_403_3@复制一份,取名HelloWorld-ipad.png@H_403_3@,并将其尺寸改成1024x768@H_403_3@。这样iphone@H_403_3@和ipad@H_403_3@都可以运行了。都是全屏幕的哦。@H_403_3@
@H_403_3@5@H_403_3@、如果你开启了retina@H_403_3@。@H_403_3@
@H_403_3@ipad @H_403_3@的图不用修改。还是1024x768@H_403_3@的-ipad@H_403_3@图。但是iphone@H_403_3@的图请用960x640@H_403_3@的-hd@H_403_3@图。(其实只有一套iphone@H_403_3@的图的话,加不加-hd@H_403_3@都可以的。但尺寸要是960x640@H_403_3@的)@H_403_3@
@H_403_3@ @H_403_3@注:ipad@H_403_3@用的是ipad2@H_403_3@,没有ipad3@H_403_3@,所以ipad3@H_403_3@可能尺寸有问题。@H_403_3@