转自:http://blog.csdn.net/somestill/article/details/9950403

  1. bool AppDelegate::applicationDidFinishLaunching()
  2. {
  3. // initialize director
  4. CCDirector *pDirector = CCDirector::sharedDirector();
  5. pDirector->setOpenGLView(CCEGLView::sharedOpenGLView());
  6.  
  7. CCSize frameSize = CCEGLView::sharedOpenGLView()->getFrameSize();
  8. CCSize lsSize = CCSizeMake(, );
  9. float scaleX = (float)frameSize.width/lsSize.width;
  10. float scaleY = (float)frameSize.height/lsSize.height;
  11.  
  12. float scale = 0.0f; // MAX(scaleX, scaleY);
  13. if (scaleX > scaleY) {
  14. // 如果是 X 方向偏大,那么 scaleX 需要除以一个放大系数,放大系数可以由枞方向获取,
  15. // 因为此时 FrameSize 和 LsSize 的上下边是重叠的
  16. scale = scaleX / (frameSize.height / (float) lsSize.height);
  17. } else {
  18. scale = scaleY / (frameSize.width / (float) lsSize.width);
  19. }
  20. CCEGLView::sharedOpenGLView()->setDesignResolutionSize(lsSize.width * scale, lsSize.height * scale, kResolutionNoBorder);
  21.  
  22. // turn on display FPS
  23. pDirector->setDisplayStats(true);
  24.  
  25. // set FPS. the default value is 1.0/60 if you don't call this
  26. pDirector->setAnimationInterval(1.0 / );
  27.  
  28. // create a scene. it's an autorelease object
  29. CCScene *pScene = HelloWorld::scene();
  30.  
  31. // run
  32. pDirector->runWithScene(pScene);
  33.  
  34. return true;
  35. }

首先,在前期进行拉伸,之后,如果出现黑边,后期,在通过调整背景图片进行填充:

  1. CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();
  2.  
  3. if ((int)(visibleSize.width + 0.5) != ) {
  4. float max_width = MAX(visibleSize.width, );
  5. float min_width = MIN(visibleSize.width, );
  6. m_bg->setScaleX(max_width/min_width);
  7. }
  8. else{
  9. float max_width = MAX(visibleSize.height, );
  10. float min_width = MIN(visibleSize.height, );
  11. m_bg->setScaleY(max_width/min_width);
  12. }

这样,就能既不失真,又不会出现黑边。 推荐看这里,讲解的非常详细。

  1. // 组[1] :
  2. FrameSize: width = , height =
  3. WinSize: width = , height =
  4. VisibleSize: width = , height =
  5. VisibleOrigin: x = , y =
  6.  
  7. // 组[2] :相比 组 [1] FrameSize 不变 VisibleSize 和 VisibleOrigin 随着 WinSize 的变小而变小
  8. FrameSize: width = , height =
  9. WinSize: width = , height =
  10. VisibleSize: width = , height =
  11. VisibleOrigin: x = , y =
  12.  
  13. // 组[3] : 相比组 [1] WinSize 不变,VisibleSize 随着 FrameSize 的比例改变而改变
  14. FrameSize: width = , height =
  15. WinSize: width = , height =
  16. VisibleSize: width = , height =
  17. VisibleOrigin: x = , y =
  18.  
  19. // WinSize VisibleSize VisibleOrigin 与都设计的分辨率相关,满足如下关系
  20. WinSize.width = (VisibleOrigin.x * ) + VisibleSize.width
  21. WinSize.height = (VisibleOrigin.y * ) + VisibleSize.height

其中,frameSize为屏幕分辨率,winSize为设计分辨率,visibleSize为可用分辨率(可用区域)

FrameSize 是实际的屏幕分辨率,而 VisibleSize 是在 WinSize 之内,保持 FrameSize 的宽高比所能占用的最大区域,实际屏幕分辨率可以大于 WinSize ,但VisibleSize 一定会小于或者等于 WinSize,这两者相同的是宽高比。VisibleSize 有着 WinSize 大小(随WinSize 的大小改变而改变),还有着 FrameSize 的宽高比,它标示 在设计分辨率(WinSize)下,在屏幕中的可见区域大小。

我们可以通过如下方法获取到 setDesignResolutionSize 所设置的值:

CCSize winSize = CCDirector::sharedDirector()->getWinSize();

cocos2d-x 屏幕分辨率适配方法的更多相关文章

  1. Unity 利用NGUI做屏幕分辨率适配+学习UIDraggablePanel的使用

    原地址:http://blog.sina.com.cn/s/blog_697b1b8c0101g2r4.html 大家使用unity,一定有看中其跨平台的强大功能,因此也难免会遇到不同屏幕分辨率适配的 ...

  2. Android屏幕分辨率获取方法--源码剖析

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 在适配的过程中,有时我们会用到屏幕宽高,那么如何获得屏幕的分辨率? 方法有两种: 第一种是通过Win ...

  3. 3.QT屏幕分辨率适配

    需求:qt的窗口.组件.字体需要适配屏幕分辨率. 思路:qt是根据显示器的物理长度或者宽度于分辨率的关系来计算dpi 实现: #if(QT_VERSION >= QT_VERSION_CHECK ...

  4. Cocos2D中屏幕分辨率解释

    Cocos2D的坐标(0,0)点在屏幕的左下角,然后x和y的坐标值像右上角逐渐增加. 因为项目一般是横屏(landscape)模式,这表示右上角坐标在3.5寸屏上为(480,320), 在4寸屏上为( ...

  5. Android4.0以上版本比较靠谱的获取手机屏幕分辨率的方法

    /** * 获取虚拟按键栏高度 * * @param context * @return */ public static int getNavigationBarHeight(Context con ...

  6. 获取屏幕分辨率(C/C++)

    C/C++获取屏幕分辨率的方法 int main(int argc, char* argv[]) { // 需要添加头文件: // #include <Windows.h> system( ...

  7. 获取屏幕分辨率(C#)

    C#获取屏幕分辨率的方法 static void Main(string[] args) { // 控制台程序,需要添加程序集: // using System.Drawing; // using S ...

  8. 07、在 Windows10 上获得屏幕分辨率

    因为在 win10 上,app 在运行的时候,默认不是占满全屏幕,并且 windows runtime 当前没有提供获取 屏幕尺寸的 api.在桌面 win32 api 中,可以获取屏幕尺寸,不过因为 ...

  9. C#如何动态设置屏幕分辨率

    C#如何动态设置屏幕分辨率 作者:Learning hard 这篇文章主要为大家详细介绍了C#动态设置屏幕分辨率的方法,我们可以使用Screen类设置屏幕分辨率,感兴趣的小伙伴们可以参考一下 下面就不 ...

随机推荐

  1. 关于Android app的launcher图标更换后,仍然显示默认的ic_launcher图标的解决方法

    <h1>概要</h1>在做手机适配的时候,遇到了一个很奇怪的问题,在1080x720的手机可以正常显示替换的ic_launcher.png图标,但是在1920x1080的手机上 ...

  2. spring属性注入方式

    一.使用有参构造注入属性 配置文件 constructor-arg标签是需注入属性的名字 User类 生成了User的有参构造函数 测试类 结果 打印出了name属性的值 二.使用set方法注入属性 ...

  3. Linux中的man

    1.查看命令的帮助信息 man mkdir 2.查看服务配置文件的帮助信息 man services 说明: a.如果没有man通过yum install man安装 b.如果命令和服务同名了,那就指 ...

  4. JVM指令重排

    指令重排的基本原则: a.程序顺序原则:一个线程内保证语义的串行性 b.volatile规则:volatile变量的写,先发生于读 c.锁规则:解锁(unlock)必然发生在随后的加锁(lock)前 ...

  5. Property Animator基本用法

    ObjectAnimator anim=ObjectAnimator.ofFloat(textview, "alpha", 0f, 1f); //ObjectAnimator an ...

  6. static_new

    <?php //在::操作符的左边写上类的名称来静态地访问某个成员,这样就可以避免创建类的实例. //这样不仅可以省略掉实例化类的代码,而且还会更高效,因为类的每个实例都会占用一小部分的系统资源 ...

  7. frontend-tools

    收集整理好用的前端开发利器(Collect good front-end development tools ) 1.w3cplus前端工具 2.jsfiddle在线JS代码调试工具 3.w3cfun ...

  8. Redis的管理

    一.redis持久化 redis是内存数据库,一切的数据都是存储到内存中的,我们知道,当服务器意外关机,那么在内存中的数据都将丢失,但是redis为我们提供持久化功能,这样就能把数据保存到硬盘上.re ...

  9. Python 3 mysql 数据类型

    Python 3 mysql 数据类型 存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己的宽度,但宽度是可选的 详细参考: http://www.runoob.com/m ...

  10. hadoop 学习笔记:mapreduce框架详解(转)

    原文:http://www.cnblogs.com/sharpxiajun/p/3151395.html(有删减) Mapreduce运行机制 下面我贴出几张图,这些图都是我在百度图片里找到的比较好的 ...