近期在写一个项目,要求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的,那么仅仅须要写一个函数

[cpp] view plaincopy
  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()中调用,使用方法例如以下:

[cpp] view plaincopy
  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);

代码例如以下:

[cpp] view plaincopy
  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. pyqt界面屏幕分辨率自适应_在Qt5和PyQt5中设置支持高分辨率屏幕自适应的方法

    在Qt5和PyQt5中设置支持高分辨率屏幕自适应的方法 PyQt5: 程序入口添加 QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHi ...

  2. element table固定表头,表的高度自适应解决方法

    element table固定表头,表的高度自适应解决方法 参考文章: (1)element table固定表头,表的高度自适应解决方法 (2)https://www.cnblogs.com/muou ...

  3. vue指令:v-cloak渲染指令(v-cloak 指令是解决屏幕闪动的好方法)

    可以使用 v-cloak 指令设置样式,这些样式会在 Vue 实例编译结束时,从绑定的 HTML 元素上被移除. 当网络较慢,网页还在加载 Vue.js ,而导致 Vue 来不及渲染,这时页面就会显示 ...

  4. 计算机检测不到双显示器,win10系统双屏幕检测不到第二屏幕怎么办 解决双屏幕不显示的方法步骤...

    win10系统双屏幕检测第二屏幕的方法步骤!很多win10系统用户都喜欢双屏显示,但是有时候可能会碰到一些情况,比如检测不到第二屏幕,那么电脑双屏幕检测不到第二屏幕怎么办呢?今天脚本之家小编就给大家详 ...

  5. Android手机接入usb屏幕失灵,手机屏幕失灵了怎么办?安卓手机屏幕失灵解决方法...

    手机屏幕失灵了怎么办呢?手机屏幕失灵的情况,相信有些朋友会遇到,那么要怎么解决呢?下文小编就为大家带来手机屏幕失灵的解决方法,有需要的朋友可以来下文了解下哦~ 手机屏幕失灵解决方法: 方法一: 1.关 ...

  6. android 屏幕没反应了,手机屏幕失灵了怎么办?安卓手机屏幕失灵解决方法

    手机屏幕失灵了怎么办呢?手机屏幕失灵的情况,相信有些朋友会遇到,那么要怎么解决呢?下文小编就为大家带来手机屏幕失灵的解决方法,有需要的朋友可以来下文了解下哦~ 手机屏幕失灵解决方法: 方法一: 1.关 ...

  7. 网页自适应手机屏幕的几种方法

    网页自适应手机屏幕的几种方法 一. 允许网页宽度自动调整 <meta name="viewport" content="width=device-width, in ...

  8. video.js视频高度自适应解决方法

    video.js视频高度自适应解决方法 1.引入两个外部文件,或者下载到本地 <link href="https://unpkg.com/video.js/dist/video-js. ...

  9. win10计算机亮度无法调节,Win10电脑无法调节亮度怎么办 Win10系统不能调节屏幕亮度解决方法...

    在使用电脑的过程中,相信绝大数的会根据自己的适应度来调节电脑屏幕的亮度,这样保护你的视力,最近有不少用户反映Win10系统,无法调节屏幕亮度,那么Win10电脑无法调节亮度怎么办?下面装机之家分享一下 ...

最新文章

  1. python课程与c+课程有什么不同-C和Python我该先学什么?
  2. MySQL 5.6 中的 TIMESTAMP 和 explicit_defaults_for_timestamp 参数
  3. mybatis学习笔记(3)—数据库和bean名称不一样处理方案
  4. ssh无密码登录设置(centos6系统下实现)
  5. linux下如何搜索某个文件,技术|如何在 Linux 中查找一个文件
  6. Apache Qpid 认证绕过漏洞
  7. 上海服务器虚拟机系统,服务器虚拟机系统重装系统
  8. laravel无法运行php,Laravel:php artisan服务无法启动
  9. 【超详细整理数组基础知识点】(学习笔记8--数组上)
  10. voms下的反射大师_大师们都爱磨砂,只有卒姆托将他发挥到极致
  11. 测试用例集-9.QQ登录功能测试用例
  12. 112654 个招聘数据告诉你,程序员 2019 年该去哪!
  13. Android优美代码赏析:Snake游戏分析
  14. 国务院关于积极推进“互联网+”行动的指导意见
  15. Pro 了,更强了 — 米家台灯 Pro 评测
  16. 网络:七层,HTTP应用层、TCP传输层、IP网络层,拔网线TCP还在,三次握手保证双向与减少因延时传输错误
  17. pytorch-实现天气识别
  18. linux数据异地备份,linux异地实时备份
  19. 一种应用于档案馆档案库房的三维可视化温湿度监控系统平台
  20. 如何使用AE制作文字破碎动画?制作ae破碎文字特效教程分享

热门文章

  1. 清官谈mysql中utf8和utf8mb4区别
  2. 自动化运维环境搭建过程
  3. Java并发编程实战_[Java并发编程实战] 简介
  4. Hibernate自动创建表
  5. 【MyBatis框架】高级映射-一对一查询
  6. Laravel核心解读 -- Response
  7. 关于5G被激烈讨论的那些争端和冲突
  8. Android WebView与JS交互入门
  9. Java程序猿面试体会,还没找到工作的“猿猿们”看过来!
  10. 前端工程师技能之photoshop巧用系列扩展篇——自动切图