[cocos2d-x]屏幕自适应解决的方法
近期在写一个项目,要求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的,那么仅仅须要写一个函数
- int ViewAutoScale(cocos2d::CCEGLView* view,
- void* title,
- int width,
- int height,
- cocos2d::CCSize* supportDisplay,
- int displays,
- int defaultWidth,
- int defaultHeight)
- {
- if(view == NULL)
- {
- return -1;
- }
- for (int i=0; i < displays; i++)
- {
- if ((w==size.width && h==size.height) || (h==size.width && w==size.height))
- {
- view->Create((LPCTSTR)title, width, height);
- return i+1;
- }
- }
- view->Create((LPCTSTR)title, defaultWidth, defaultHeight);
- view->setScreenScale(min((float)width/ defaultWidth, (float)height/ defaultHeight));
- view->resize(width, height);
- view->centerWindow();
- return 0;
- }
这个函数要放在AppDelegate.cpp中作为全局函数。然后在
bool AppDelegate::initInstance()中调用,使用方法例如以下:
- bool AppDelegate::initInstance()
- {
- bool bRet = false;
- do
- {
- #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
- // Initialize OpenGLView instance, that release by CCDirector when application terminate.
- // The HelloWorld is designed as HVGA.
- CCSize sSupportDisplay[]={CCSize(1024, 768)};
- CCEGLView * pMainWnd = new CCEGLView();
- //CC_BREAK_IF(! pMainWnd
- // || ! pMainWnd->Create(TEXT("回乡偶书"), 1024, 768));
- if (ViewAutoScale(pMainWnd,TEXT("回乡偶书"),1024,768,
- sSupportDisplay,
- sizeof(sSupportDisplay)/sizeof(CCSize),
- 1024,
- 768)<0)
- {
- return false;
- }
- #endif // CC_PLATFORM_WIN32
}
上面的1024*768是我们本身的大小,800*480是我们想适应的大小,这样,就仅仅要调整800*480的參数。就能够改成自己想要的大小。
第二个是在andriod下实现屏幕自适应,事实上更简单,仅仅须要一个方法。并且cocos2d-x以下已经帮我们实现好了,仅仅须要调用就可以。
改动方法例如以下:
进入到HelloWorld/android/jni/helloworld/main.cpp中,
然后调用view->create(1024,768);
代码例如以下:
- void Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit(JNIEnv* env, jobject thiz, jint w, jint h)
- {
- if (!cocos2d::CCDirector::sharedDirector()->getOpenGLView())
- {
- cocos2d::CCEGLView *view = &cocos2d::CCEGLView::sharedOpenGLView();
- view->setFrameWidthAndHeight(w, h);
- view->create(1024,768);
- // if you want to run in WVGA with HVGA resource, set it
- // view->create(480, 320); Please change it to (320, 480) if you're in portrait mode.
- cocos2d::CCDirector::sharedDirector()->setOpenGLView(view);
- AppDelegate *pAppDelegate = new AppDelegate();
- cocos2d::CCApplication::sharedApplication().run();
- }
- else
- {
- cocos2d::CCTextureCache::reloadAllTextures();
- cocos2d::CCDirector::sharedDirector()->setGLDefaultValues();
- }
- }
这样,就能够了,无论andriod是什么分辨率,使用了这种方法后,都会自己主动调整,一切ok。
好了,如今总结一下
用第三种方法固然后,但是也有弊端,譬如说程序本来是支持1024*768的,然后我们要改成800*480的。宽和高是不成比例的。所以用这样的方法后,在x轴上会有黑边。
假设要全屏的效果,那仅仅能用第一种方法,做多套资源处理之。
[cocos2d-x]屏幕自适应解决的方法的更多相关文章
- 一个伟大的发现,装X一下。笔记本win7系统64位机器执行unity 时,屏幕模糊解决的方法
笔者笔记本win7系统64位机器执行unity 时.往往切换时unity界面屏幕模糊,后来发现此时须要下载DirectXRuntimes201006x64,安装就可以.
- layer弹出层不居中解决方案,layer提示不屏幕居中解决方法,layer弹窗不居中解决方案
layer弹出层不居中解决方案,layer提示不屏幕居中解决方法,layer弹窗不居中解决方案 >>>>>>>>>>>>> ...
- HTML5工具做屏幕自适应的两种方法
近一两年,HTML5在中国很火,也出了不少HTML5工具和模板.别的先不说,对于不同的H5工具,解决屏幕自适应问题的区别是什么? 简单来说,感应式设计是当用不同设备访问时,能够根据设备的宽度和高度对设 ...
- css中添加屏幕自适应方法(rem)
css中添加屏幕自适应方法(rem) 只需要在公共css文件中添加下面代码:设计稿以750px,基础字体为20px为例,兼容性高,使用过程中px转化为rem即可 /*竖屏*/ @media scree ...
- VirtualBox内刚刚安装完CentOS6.9和7系统,无法调整屏幕的分辨率,也无法设置共享文件夹。解决的方法就是安装VirtualBox客户端增强包。
VirtualBox内刚刚安装完CentOS6.9和7系统,无法调整屏幕的分辨率,也无法设置共享文件夹.解决的方法就是安装VirtualBox客户端增强包. 1.若直接安装客户端增强包会得到如下提示: ...
- width: calc(100% - 80px); 屏幕自适应方法
width: calc(100% - 80px); 屏幕自适应方法
- dedecms织梦手机端文章内容页图片不能自适应解决方法
dedecms织梦手机端文章内容页图片不能自适应解决方法: 方法一修改手机端文章页模板代码: 找到并打开手机端的文章内容页模板,将里面的{dede:field.body/}标签修改一下,改为如下的标签 ...
- 4种必须知道的Android屏幕自适应解决方案
文章来源:http://blog.csdn.net/shimiso/article/details/19166167 demo下载:http://www.eoeandroid.com/forum.ph ...
- 【Cocos2d-x 3.x】屏幕自适应匹配
在进行游戏开发时, 由于市场上的Android移动设备的分辨率有很多种,而且IOS移动设备的分辨率也不相同,为了能让手游能在90%以上的移动设备较为完美的运行,因此需要考虑屏幕的自适应问题,让一套资源 ...
随机推荐
- Ch03 视图基础
3.1 视图简介 3.1.1 选择待渲染视图 3.1.2 重写视图名 3.2 给视图传递数据 3.2.1 ViewDataDictionary 3.2.2 ViewBag 3.2.3 带 ...
- HttpWebRequest 基础连接已经关闭: 接收时发生错误
HttpWebRequest request = null; Stream webStream = null; HttpWebResponse response = null; StreamReade ...
- PHP学习之-面向对象
PHP学习之-面向对象 1.什么是对象 "世界万物皆对象",一切可以被抽象出来的东西都是对象.像花,草.看不到的"概念"都是对象. 2.对象的基本组成 a.属性 ...
- IOS详解TableView——对话聊天布局的实现
上篇博客介绍了如何使用UITableView实现类似QQ的好友界面布局.这篇讲述如何利用自定义单元格来实现聊天界面的布局. 借助单元格实现聊天布局难度不大,主要要解决的问题有两个: 1.自己和其他人说 ...
- lucene做简单的文件索引
package com.mylucene; import java.io.File; import java.io.FileReader; import java.io.IOException; im ...
- Delphi XE2 升级项目编译ralease版本,无法添加UAC解决方法
我今天把一个原来是Delphi2007的工程升级到了Delphi XE2,在编译ralease版本时候,发现无法添加UAC,我觉得可能是升级的原因,随后我用XE2新建了一个工程,但是在编译raleas ...
- c#1所搭建的核心基础之值类型和引用类型
这个主题很重要,在.NET中做的一切其实都是在和一个值类型或者引用类型打交道. 现实世界中的值和引用 假定你在读一份非常棒的东西,希望一个朋友也去读他.于是你到复印室里复印了一份.这个时候他获得了属于 ...
- 深入理解Arrays.sort() (转)
Arrays.sort(T[], Comparator < ? super T > c) 方法用于对象数组按用户自定义规则排序.官方Java文档只是简要描述此方法的作用,并未进行详细的介绍 ...
- shell字符串长度
方法一 $ expr length "Find out the length of this string from Linux Bash shell." 57 方法二 str1= ...
- cocos2d-x游戏开发系列教程-编译运行我们的第一个cocos2d-x游戏程序
环境准备和介绍: 操作系统:64位Windows 7 sp1(Microsoft Windows [版本 6.1.7601]) 必要的软件和源码: visual_studio_ultimate_201 ...