近期在写一个项目,要求pc,ipad,andriod平台上都能够执行,所以选择用cocos2d-x来开发。

我们的资源大小是1024*768的,在pc上和苹果上都是没有问题的,但是到了andriod上。问题就来了。andriod上有有各种各样的分辨率。那么程序在全部的分辨率上都能够正常执行显示呢?针对这个问题,我想了好几种方法:

(1)弄多套资源

由于这个项目里面有非常多动画资源,假设要弄多套资源,工作量比較大,项目时间比較紧,不同意用这套方案

(2)cocos2d-x里面有一个方法

pDirector->setContentScaleFactor(0.5);

这种方法是把整个场景缩小到一半,界面上看上去没问题,但是里面要点击的精灵对应位置全不正确了,假设用这套方法。代码要写好几套,要依据不同的分辨率来调整不同精灵的摆放位置和对应位置。

虽然资源是一份。但是,代码要又一次写过,要先机器的分辨率,然后再决定用那套精灵位置和对应位置的代码。可怎样或如andriod以下机器分分辨率,这个还是个问题。

再三思考后,打算做成多个apk文件,就做主流的分辨率,譬如说1024*768,1280*800,800*480等。

本来已经打算这么弄了,可还是发现了更好的第三种办法。

(3)这样的办法仅仅须要一套资源。精灵位置也仅仅有一套(无论是绝对位置还是相对位置),绝对是最佳的选择。

先说windows下的解决方法:

譬如说我们的项目是1024*768的,如今要改成大小是800*600的,那么仅仅须要写一个函数

  1. int ViewAutoScale(cocos2d::CCEGLView* view,
  2. void* title,
  3. int width,
  4. int height,
  5. cocos2d::CCSize* supportDisplay,
  6. int displays,
  7. int defaultWidth,
  8. int defaultHeight)
  9. {
  10. if(view == NULL)
  11. {
  12. return -1;
  13. }
  14. for (int i=0; i < displays; i++)
  15. {
  16. if ((w==size.width && h==size.height) || (h==size.width && w==size.height))
  17. {
  18. view->Create((LPCTSTR)title, width, height);
  19. return i+1;
  20. }
  21. }
  22. view->Create((LPCTSTR)title, defaultWidth, defaultHeight);
  23. view->setScreenScale(min((float)width/ defaultWidth, (float)height/ defaultHeight));
  24. view->resize(width, height);
  25. view->centerWindow();
  26. return 0;
  27. }

这个函数要放在AppDelegate.cpp中作为全局函数。然后在

bool AppDelegate::initInstance()中调用,使用方法例如以下:

  1. bool AppDelegate::initInstance()
  2. {
  3. bool bRet = false;
  4. do
  5. {
  6. #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
  7. // Initialize OpenGLView instance, that release by CCDirector when application terminate.
  8. // The HelloWorld is designed as HVGA.
  9. CCSize sSupportDisplay[]={CCSize(1024, 768)};
  10. CCEGLView * pMainWnd = new CCEGLView();
  11. //CC_BREAK_IF(! pMainWnd
  12. //      || ! pMainWnd->Create(TEXT("回乡偶书"), 1024, 768));
  13. if (ViewAutoScale(pMainWnd,TEXT("回乡偶书"),1024,768,
  14. sSupportDisplay,
  15. sizeof(sSupportDisplay)/sizeof(CCSize),
  16. 1024,
  17. 768)<0)
  18. {
  19. return false;
  20. }
  21. #endif  // CC_PLATFORM_WIN32

}

上面的1024*768是我们本身的大小,800*480是我们想适应的大小,这样,就仅仅要调整800*480的參数。就能够改成自己想要的大小。

第二个是在andriod下实现屏幕自适应,事实上更简单,仅仅须要一个方法。并且cocos2d-x以下已经帮我们实现好了,仅仅须要调用就可以。

改动方法例如以下:

进入到HelloWorld/android/jni/helloworld/main.cpp中,

然后调用view->create(1024,768);

代码例如以下:

  1. void Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit(JNIEnv*  env, jobject thiz, jint w, jint h)
  2. {
  3. if (!cocos2d::CCDirector::sharedDirector()->getOpenGLView())
  4. {
  5. cocos2d::CCEGLView *view = &cocos2d::CCEGLView::sharedOpenGLView();
  6. view->setFrameWidthAndHeight(w, h);
  7. view->create(1024,768);
  8. // if you want to run in WVGA with HVGA resource, set it
  9. // view->create(480, 320);  Please change it to (320, 480) if you're in portrait mode.
  10. cocos2d::CCDirector::sharedDirector()->setOpenGLView(view);
  11. AppDelegate *pAppDelegate = new AppDelegate();
  12. cocos2d::CCApplication::sharedApplication().run();
  13. }
  14. else
  15. {
  16. cocos2d::CCTextureCache::reloadAllTextures();
  17. cocos2d::CCDirector::sharedDirector()->setGLDefaultValues();
  18. }
  19. }

这样,就能够了,无论andriod是什么分辨率,使用了这种方法后,都会自己主动调整,一切ok。

好了,如今总结一下

用第三种方法固然后,但是也有弊端,譬如说程序本来是支持1024*768的,然后我们要改成800*480的。宽和高是不成比例的。所以用这样的方法后,在x轴上会有黑边。

假设要全屏的效果,那仅仅能用第一种方法,做多套资源处理之。

[cocos2d-x]屏幕自适应解决的方法的更多相关文章

  1. 一个伟大的发现,装X一下。笔记本win7系统64位机器执行unity 时,屏幕模糊解决的方法

    笔者笔记本win7系统64位机器执行unity 时.往往切换时unity界面屏幕模糊,后来发现此时须要下载DirectXRuntimes201006x64,安装就可以.

  2. layer弹出层不居中解决方案,layer提示不屏幕居中解决方法,layer弹窗不居中解决方案

    layer弹出层不居中解决方案,layer提示不屏幕居中解决方法,layer弹窗不居中解决方案 >>>>>>>>>>>>> ...

  3. HTML5工具做屏幕自适应的两种方法

    近一两年,HTML5在中国很火,也出了不少HTML5工具和模板.别的先不说,对于不同的H5工具,解决屏幕自适应问题的区别是什么? 简单来说,感应式设计是当用不同设备访问时,能够根据设备的宽度和高度对设 ...

  4. css中添加屏幕自适应方法(rem)

    css中添加屏幕自适应方法(rem) 只需要在公共css文件中添加下面代码:设计稿以750px,基础字体为20px为例,兼容性高,使用过程中px转化为rem即可 /*竖屏*/ @media scree ...

  5. VirtualBox内刚刚安装完CentOS6.9和7系统,无法调整屏幕的分辨率,也无法设置共享文件夹。解决的方法就是安装VirtualBox客户端增强包。

    VirtualBox内刚刚安装完CentOS6.9和7系统,无法调整屏幕的分辨率,也无法设置共享文件夹.解决的方法就是安装VirtualBox客户端增强包. 1.若直接安装客户端增强包会得到如下提示: ...

  6. width: calc(100% - 80px); 屏幕自适应方法

    width: calc(100% - 80px); 屏幕自适应方法

  7. dedecms织梦手机端文章内容页图片不能自适应解决方法

    dedecms织梦手机端文章内容页图片不能自适应解决方法: 方法一修改手机端文章页模板代码: 找到并打开手机端的文章内容页模板,将里面的{dede:field.body/}标签修改一下,改为如下的标签 ...

  8. 4种必须知道的Android屏幕自适应解决方案

    文章来源:http://blog.csdn.net/shimiso/article/details/19166167 demo下载:http://www.eoeandroid.com/forum.ph ...

  9. 【Cocos2d-x 3.x】屏幕自适应匹配

    在进行游戏开发时, 由于市场上的Android移动设备的分辨率有很多种,而且IOS移动设备的分辨率也不相同,为了能让手游能在90%以上的移动设备较为完美的运行,因此需要考虑屏幕的自适应问题,让一套资源 ...

随机推荐

  1. .NET vs JAVA

    一个同事写一个方案,让我补充下.NET和 JAVA语言的优缺点,以下是我的回复: 老X你好! 我觉得这个问题,本质上不是java和.net两个开发语言方面的比较,单纯从这两个开发语言来讲,部分伯仲,在 ...

  2. Java中二进制、十进制、十六进制及ASCII码与String及字节数组与十六进制之间的转换

    public class DigitalTrans { /** * 数字字符串转ASCII码字符串 * * @param String * 字符串 * @return ASCII字符串 */ publ ...

  3. linux命令:Linux命令大全

    Linux命令大全 http://man.linuxde.net/

  4. Expert for SQL Server 诊断系列

    Expert for SQL Server 诊断系列 Expert 诊断优化系列------------------锁是个大角色   前面几篇已经陆续从服务器的几个大块讲述了SQL SERVER数据库 ...

  5. 重操JS旧业第三弹:Array

    数组在任何编程语言中都是非常重要的,因为函数在最大程度上代表了要实现的功能,而数组则是这些函数所要操作的内存一部分. 1 构建数组 js与其他非脚本语言的灵活之处在于要实现一个目标它可能具有多种方式, ...

  6. 深入浅出Hadoop实战开发(HDFS实战图片、MapReduce、HBase实战微博、Hive应用)

    Hadoop是什么,为什么要学习Hadoop?     Hadoop是一个分布式系统基础架构,由Apache基金会开发.用户可以在不了解分布式底层细节的情况下,开发分布式程序.充分利用集群的威力高速运 ...

  7. DBA 应该要注意Linux 环境下的一些操作

    DBA 对OS的依赖.一丁点儿也不亚于DB.对于Oracle DBA.尤为突出     DB和OS的感情也与日俱增.耦合度高的让人一度以为这两要劳燕双飞了 例如.Oracle里面. 而且.故障诊断以及 ...

  8. Unity 3D学习笔记(三)——关于脚本

    在脚本中定义的类成员,如果是公共的话,在脚本与游戏对象绑定之后,是可以在Inspector中编辑的,例如下面这个脚本: using UnityEngine; using System.Collecti ...

  9. TPanel的默认颜色存储在dfm中,读取后在Paint函数中设置刷子的颜色,然后填充整个背景

    声明如下: TCustomPanel = class(TCustomControl) private FFullRepaint: Boolean; FParentBackgroundSet: Bool ...

  10. Android网络电话软件Sipdroid试用

    Android网络电话软件Sipdroid试用 SipDroid v3.4beta 简介:sipdroid是一款基于网络的语音及视频通话客户端软件,sipdroid本身不经营网络语音服务,仅仅是一款开 ...