zoukankan      html  css  js  c++  java
  • Cocos2d-x 多分辨率支持

    最近遇到多分辨率支持问题,所以查了一些资料。将一些收获共享一下,以便自己和其他需要的朋友日后参考。

    如果我要建立一个cocos2d-x项目,我的目标是支持iphone3G( 480, 320 ),iphone4/4s( 960, 640 ), iphone5( 1136, 640 ),ipad1/2( 1024, 768 ),ipad 3( 2048, 1536 ),以及所有android设备(其分辨率可能是( 800, 480 )等其它各种分辨率)?我该如何规划呢?但在你规划之前是否清楚cocos2d-x是如何为多分辨率支持进行设计的?

    所以首先来看一下,cocos2d-x提供的基本支持。

    1. Cocos2d-x自从2.0.2版本起,不在采用-hd,-ipd,-ipdhd等文件名称后缀了,因为其目标是支持是跨平台,不再是单单IOS系统了。改用CCFileUti类中的setResourceDirectory()(2.0.4版本)或者setSearchPaths()(2.1.1版本)。我们只需在resource目录下为每个系统建立自己的目录,并将对应资源放进去(具体参考http://www.cocos2d-x.org/projects/cocos2d-x/wiki/Mechanism_of_loading_resources)。

    2. Cocos2d-x自从2.0.4版本起,去除了setRetinaEnable()函数,因为cocos2d-x将默认开启retina(如果设备支持的话),并带来了全新的概念。你需要理解designSize和contentScaleFactor,以及designSize将如何映射到窗口上。我简单解释一下:

      1.designSize:从字面意思就是设计大小。“设计”两字为何意?好比我们抛开不同设备分辨率,就假定只有一个标准界面,让标准界面隐藏背后不同设备的差异。这个标准界面就是designSize。Cocos2d-x也将向标准界面“看齐”,   一旦我们设置了designSize,cocos2d-x中的getWinSize就成了我们的designSize。我们一般设置其为(480,320)“经典”大小,但假如你的初始资源是(1024,768)大小的,那么我们可以使用(512,384)的设计界面,保证资源的宽高比和设计宽高比相同,能保证资源全屏。

      2.contentScaleFactor:从字面意思内容缩放因子,内容即我们的资源(我是这么理解的)。一般contentScaleFactor = resourceHeight / designSize.Height;为什么要有这个东西?因为刚才我们说了designSize,我们将其设置为(480,320),而且以后我们的winSize就成了designSize,但是我们用在iphone4中背景图片还是(960,640)的,此时我们的图片是屏幕4倍大,就显示不开了。有了缩放因子,我们就能将背景图片(960,640)的编程(480,320)。这样原本全屏的资源,现在仍然是全屏的。

      3.designSize如何映射到“真实窗口”上的:这个过程就是将我们的”标准界面“映射到真实的设备上。我们真实设备的大小可能有很多变化。(480,320)的设计界面如何映射到,假如说(1136,640)的呢?有三种kResourceExactFit,kResourceNoBorder,kResourceShowAll。

      第一种是完全适应,即不论你真是设备分辨率多么”怪异“,它都将设计界面恰好的贴上去。看似”完美“的方案,但也存在瑕疵,那就是变形。你的人物可能”变
      胖“,或者”拉瘦“。

      第二种是没边界,即没有边界限制,假如你的”设计界面“是(480,320),目标设备是(1136,640)。如果目标设备的长宽比率和设计界面的长宽比率不一
      样,那么这个模式采用超出目标设备边界的拉伸方式,也就是设计界面有一边完全适应,另一边超出的方式。在我们当前假设的这种情况,那就是会将设计界
      面的宽拉伸到1136.然后高等比放大。这样的话,我们会发现,宽正好”全屏“,但是高超出去。这也就是所谓了没有边界限制的”好处“。

      第三种是全显示,即全部显示,假如你的”设计界面“是(480,320),目标设备是(1136,640)。那么这种模式会保证你的设计界面一定能全部显示。也就
      是说,如果目标设备的长宽比率和设计界面的长宽比率不一样,那么这个模式采用限制到目标设备边界的拉伸方式。在我们当前假设的这种情况,那就是会将
      设计界面的高拉伸到640.然后宽等比放大。这样的话,我们会发现,高正好”全屏“,但是宽被”挤“了(在两边留有黑边)。这也就是所谓了全部显示的”好处“。

      (具体参考http://www.cocos2d-x.org/projects/cocos2d-x/wiki/Multi_resolution_support

    3. 另外cocos2d-x有个“诡异”的特点(至少在cocos2d-x 2.1.1版本),那就是当你开启【iphone Retina 4-inch】的时候,如果你没有设置启动封面,那么winSize仍将是(960,640)。所以必须设置启动封面,才能得到winSize(1136,640)。

    知道cocos2d-x对过分辨率的支持后,我们就更加能理解好自己项目要怎样才能支持多分辨率。如果你用到CocosBuilder(如果你还不会使用,就请参考本人的【CocosBuilder教程系列】),那么如何让CocosBuilder也支持多分辨率呢?

    1. 因为CocosBuilder的文件读取库(即CCBReader读取ccbi文件),也是使用CCTexture来加载的,所以我们前面讲到的目录搜索规则也会自动被使用到ccbi的文件加载中去。虽然CocosBuilder有跟Cocos2d一样的的承诺“-hd,-ipd,-ipdhd",但这些在cocos2d-x作用已经失效。

    2. 由于我们面向多分辨率,所以我们一定在CocosBuilder中使用百分比模式来设置坐标和大小。否则,你设定的坐标就不会自动适应对应的设备分辨率。例如:你设置一个登陆框,你不应该将其坐标设置为(512,384),因为这个坐标在(480,320)的iphone3G或者android设备,可能直接看不到,而且和其他元素之间的相对距离也就混乱不堪。所以使用百分比(50%,50%),能保证在任何设备上都是居中的。
    通过上面讲述,你应该能找到自己的多分辨率支持解决方案。一套资源也好,两套,三套都可以,主要还是看每个游戏自己的需求。
  • 相关阅读:
    BNU 51002 BQG's Complexity Analysis
    BNU OJ 51003 BQG's Confusing Sequence
    BNU OJ 51000 BQG's Random String
    BNU OJ 50999 BQG's Approaching Deadline
    BNU OJ 50998 BQG's Messy Code
    BNU OJ 50997 BQG's Programming Contest
    CodeForces 609D Gadgets for dollars and pounds
    CodeForces 609C Load Balancing
    CodeForces 609B The Best Gift
    CodeForces 609A USB Flash Drives
  • 原文地址:https://www.cnblogs.com/fuland/p/3628655.html
Copyright © 2011-2022 走看看