zoukankan      html  css  js  c++  java
  • cocos2dx项目快速适配IPAD的方法

    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个定位点在屏幕内定位。这样就可以了。
  • 相关阅读:
    分析drawImplementation(osg::RenderInfo& renderInfo,RenderLeaf*& previous)
    osg求交,模型矩阵
    Opengl RC(Render context,渲染上下文)与像素格式
    osg渲染属性和opengl的接口分析
    opengl累积缓存
    weekly review 200946: NON Memory
    推荐:每周影评2009国产电影回顾
    [Study Note] Dependency Injection and Inversion of Control
    [Study Note] TDD: Consistent test structure (测试代码的结构一致性)
    海淀驾校学车考证经历(二)第一次上车
  • 原文地址:https://www.cnblogs.com/iapp/p/3631738.html
Copyright © 2011-2022 走看看