cocos2d-iphone中兼容iphone/ipad的问题

我们知道在IOS开发中,要兼容iphone/ipad,只要把开发的版本设置为universal版就可以了,但是设置是比较简单,而里面的素材的大小和位置却是比较难控制的。原因是iphone与ipad的比例是不统一的,iphone是(480*320/960*640)3:2的屏,而ipad的屏幕是(1024*768,New ipad是2048*1536)4:3的屏。
在cocos2d-iphone中有一个很重要的方法ccp,这个方法是用于创建CGPoint。为了让IOS游戏的资源最小,我们开发了Universal版本,让其共用一套资源。由于在IOS中的高清屏(Retina960*640)比普通版本(480*320)大两倍。为了更加接近真实,我们在Ipad中采用iphone中的Retina版本素材。现在介绍一下我们的思路:
1、对ccp方法的扩展
    由于在前期开发的过程中并没有考虑Universal版本,在2.0的时候要扩展,所以以前的位置很多采用的是ccp,位置用的是iphone版本,有些是写的数字,所以要对这个方法进行扩展。我们定义了另外一个方法fcccf,这个方法可以根据系统的设备返回真实位置,传入的参数为在iphone上的X,Y轴。
#define IsPad (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)//定义是否是Ipad的宏
#define fcccf(__x__,__y__) GetPointbyPhoneXandY(__x__,__y__)//为了与ccp用法一致
/*
     * 传入Iphone位置
     */
    CG_INLINE CGPoint GetPointbyPhoneXandY(CGFloat x,CGFloat y){
        CGPoint p;
        if (IsPad) {
            //p=ccp((x+16)*2, (y+32)*2);
            p=ccp(x/0.46875, y/0.41667);
        }
        else{
            p=ccp(x, y);
        }
        return p;
    }
2、重写cocos2d-iphone中的一些基类方法
    我们知道在cocos2d-iphone中如果传入普通素材路径而又支持Retina版本的话,cocos2d-iphone会自动识别为Retina版本素材,其原则是(1)png,jpg图片在后缀前加@2x,例如icon.png和[email protected],(2)对于plist文件和pvr.ccz文件(图片压缩处理)的文件则加“-hd”,例如KeyButton.plist与KeyButton-hd.plist。跟踪到我们可以发现其实在组织资源实,cocos2d-iphone把资源的文件名已经再处理一遍,基于这种思路。我们也可以在ipad中对文件名进行处理。
cocos2d-iphone中主要的基类有CCSprite和CCLayer,我们重写一个基类命名为FCBaseSprite:CCSprite,重写+(id)spriteWithFile:(NSString *)filename、+(id)spriteWithSpriteFrameName:(NSString*)spriteFrameName等方法。另外再扩展一个方法就是对于一些背景性质的精灵可能需要拉升,再对以上两个方法重载。则FCBaseSprite定义如下:
@interface FCBaseSprite : CCSprite {
    
}
+(id)spriteWithFile:(NSString *)filename stretch:(bool)isstretch;
+ (id)spriteWithSpriteFrameName:(NSString *)spriteFrameName stretch:(bool)isstretch;
@end
实现分别是:
/*
*stretch是否按照Ipad版进行变形
*/
+(id)spriteWithFile:(NSString *)filename stretch:(bool)isstretch {
    filename=[filename getDoubleImageFilename];
    CCNode* n= [super spriteWithFile:filename];//[[[self alloc] initWithFile:filename] autorelease];
    if (isstretch&&IsPad) {
        n.scaleX=1024.0/960;
        n.scaleY=768.0/640;
    }
    return n;
}
/*
*stretch是否按照Ipad版进行变形
*/
+ (id)spriteWithSpriteFrameName:(NSString *)spriteFrameName stretch:(bool)isstretch
{
    CCSpriteFrame *frame = [[FCBaseCCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:spriteFrameName];
    
    NSAssert1(frame!=nil, @"Invalid spriteFrameName: %@", spriteFrameName);
    
    CCNode *n=[super spriteWithSpriteFrame:frame];
    if (IsPad && isstretch) {
        n.scaleX=1024.0/960;
        n.scaleY=768.0/640;
    }
    return n;
}
getDoubleImageFilename方法是我们对NSString类型的方法一个扩展,即为了获取真实的资源文件名
方法如下:
#define Retina2x @"@2x"
#define Retinahd @"-hd"

- (NSString*)getDoubleImageFilename {
    if (IsPad) {
        NSString* filenamenoExt= [self stringByDeletingPathExtension];
        NSString* extension = [self pathExtension];
        
        //NSString *extension = [path pathExtension];

if (![filenamenoExt hasSuffix:Retina2x]) {
//            if ([self retainCount]>0) {
//                [self release];
//            }
            self = [NSString stringWithFormat:@"%@%@.%@",filenamenoExt,Retina2x,extension];
            //NSLOG(@"new plist=%@",*plist_p);
        }
    }
    return self;
}

以上是我开发过程中的一部分,请各位大虾批评指出。

时间: 2024-10-09 21:04:57

cocos2d-iphone中兼容iphone/ipad的问题的相关文章

让UIAlertController同时兼容iphone和ipad

让UIAlertController同时兼容iphone和ipad by 伍雪颖 var alert = UIAlertController(title: nil, message: message, preferredStyle: UIAlertControllerStyle.ActionSheet) alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: { (al

daily news新闻阅读客户端应用源码(兼容iPhone和iPad)

daily news新闻阅读客户端应用源码(兼容iPhone和iPad),也是一款兼容性较好的应用,可以支iphone和ipad的阅读阅读器源码,设计风格和排列效果很不错,现在做新闻资讯客户端的朋友可以参考一下吧. 源码下载: http://code.662p.com/view/6384.html 详细说明:http://ios.662p.com/thread-1526-1-1.html

[iTyran原创]iPhone中OpenGL ES显示3DS MAX模型之一:OBJ格式分析

[iTyran原创]iPhone中OpenGL ES显示3DS MAX模型之一:OBJ文件格式分析作者:yuezang - iTyran 在iOS的3D开发中常常需要导入通过3DS MAX之类的3D设计软件生成的模型.因为OpenGL ES是不能直接读取这些文件的,所以常常需要开发人员增加接口来导入.通常的做法是在建模软件中建立3D模型之后在OpenGL ES中导入并进行控制.    3DS MAX通常的保存格式有*.max(现在生成的版本的格式),*.3ds(低版本的3ds Max生成的格式)

iOS开发读取plist文件、iphone中plist文件的

在Xcode中建立一个iOS项目后,会自己产生一个.plist文件,点击时会看见它显示的是类似于excel表格: 但是,如果打开方式选择Source Code,你会看见它其实是一个xml文件. 我们会做一个小例子,在这个例子中我们自己建立一个plist文件并填入数据,然后运行时读取这个plist文件,并将数据填写在界面上. 首先要知道读取plist文件的方法,一般来说,使用代码 NSString *plistPath = [[NSBundle mainBundle] pathForResourc

关于iphone中微信无法调用百度api的解决方案

http://api.map.baidu.com/direction?origin=latlng:22.550297,113.962555|name:我的位置&destination=22.553143,113.95336&mode=driving&region=''&output=html&src=yourCompanyName|yourAppName 这样的地址在安卓的微信中是能够调用百度的api,但是在iPhone的微信中不行.原因是参数需要encodeurl

[iTyran原创]iPhone中OpenGL ES显示3DS MAX模型之二:lib3ds加载模型

[iTyran原创]iPhone中OpenGL ES显示3DS MAX模型之二:lib3ds加载模型 作者:u0u0 - iTyran 在上一节中,我们分析了OBJ格式.OBJ格式优点是文本形式,可读性好,缺点也很明显,计算机解析文本过程会比解析二进制文件慢很多.OBJ还有个问题是各种3D建模工具导出的布局格式还不太一样,face还有多边形(超过三边形),不利于在OpenGL ES里面加载. .3ds文件是OBJ的二进制形式,并且多很多信息.有一个C语言写的开源库可以用来加.3ds文件,这就是l

H5页面中删除iPhone自带样式

在手机端H5页面中,iPhone往往会添加自己的样式. 比如:H5日期标签<input type="date" >,在安卓机型下不会显示特殊样式,但是在iPhone中会自带自己一个很丑的样式.又如:<input type="text" >,iPhone会自带阴影,安卓机没有. 如何去掉它?很简单,加上一行CSS代码: -webkit-appearance: none;

iphone中button按钮显示为圆形解决

iphone中button按钮显示为圆形解决: 添加样式: -webkit-appearance:button; 如果需要为直角: border-radius:0 在源码中添加如:style="-webkit-appearance:button;border-radius:0" 在外链中添加   :-webkit-appearance:button;border-radius:0

防止html5的video标签在iphone中自动全屏

问题: 当在iphone中打开html5页面中的video视频时,会默认调取系统播放器,全屏播放视频资源. 解决方式: 1. 首先在html5页面的video标签中添加webkit-playsinline=true; <video id="player" webkit-playsinline></video> 接着在UIWebView中设置allowsInlineMediaPlayback属性: webview.allowInlinesMediaPlayback