Cocos2D-X屏幕适配新解
为了适应移动终端的各种分辨率大小,各种屏幕宽高比,在 Cocos2D-X(当前稳定版:2.0.4) 中,提供了相应的解决方案,以方便我们在设计游戏时,能够更好的适应不同的环境。
- // proj.linux/main.cpp linux 平台手动指定画面大小
- CCEGLView* eglView = CCEGLView::sharedOpenGLView();
- eglView->setFrameSize(720, 480);
- // proj.android/jni/hellocpp/main.cpp android 平台由 jni 调用传入设备分辨率参数
- void Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit(JNIEnv* env, jobject thiz, jint w, jint h)
- {
- if (!CCDirector::sharedDirector()->getOpenGLView())
- {
- CCEGLView *view = CCEGLView::sharedOpenGLView();
- view->setFrameSize(w, h);
- AppDelegate *pAppDelegate = new AppDelegate();
- CCApplication::sharedApplication()->run();
- }
- else
- {
- // other
- ...
- }
- }
- CCEGLView::sharedOpenGLView()->setDesignResolutionSize(720, 480, kResolutionShowAll);
- // 或者
- CCEGLView::sharedOpenGLView()->setDesignResolutionSize(720, 480, kResolutionExactFit);
- CCSize winSize = CCDirector::sharedDirector()->getWinSize();
- // 获得 winSize
- CCSize winSize = CCDirector::sharedDirector()->getWinSize();
- // 查看其 getWinSize(); 方法实现
- [cocos2dx-path]/cocos2dx/CCDirector.cpp
- CCSize CCDirector::getWinSize(void)
- {
- return m_obWinSizeInPoints;
- }
- // 而 m_obWinSizeInPoints 是何时被赋值的
- [cocos2dx-path]/cocos2dx/platform/CCEGLViewProtocol.cpp
- void CCEGLViewProtocol::setDesignResolutionSize(float width, float height, ResolutionPolicy resolutionPolicy)
- {
- ...
- ...
- m_obDesignResolutionSize.setSize(width, height);
- ...
- ...
- CCDirector::sharedDirector()->m_obWinSizeInPoints = getDesignResolutionSize();
- }
- const CCSize& CCEGLViewProtocol::getDesignResolutionSize() const
- {
- return m_obDesignResolutionSize;
- }

- // 组[1] :
- FrameSize: width = 720, height = 420
- WinSize: width = 720, height = 480
- VisibleSize: width = 720, height = 420
- VisibleOrigin: x = 0, y = 30
- // 组[2] :相比 组 [1] FrameSize 不变 VisibleSize 和 VisibleOrigin 随着 WinSize 的变小而变小
- FrameSize: width = 720, height = 420
- WinSize: width = 480, height = 320
- VisibleSize: width = 480, height = 280
- VisibleOrigin: x = 0, y = 20
- // 组[3] : 相比组 [1] WinSize 不变,VisibleSize 随着 FrameSize 的比例改变而改变
- FrameSize: width = 720, height = 540
- WinSize: width = 720, height = 480
- VisibleSize: width = 640, height = 480
- VisibleOrigin: x = 40, y = 0
- // WinSize VisibleSize VisibleOrigin 与都设计的分辨率相关,满足如下关系
- WinSize.width = (VisibleOrigin.x * 2) + VisibleSize.width
- WinSize.height = (VisibleOrigin.y * 2) + VisibleSize.height
- CCSize size = CCDirector::sharedDirector()->getWinSize();
- CCPoint center = ccp(size.width/2, size.height/2);
- // 大小 600x500 为了 NoBorder 看到效果,使用稍大的背景图
- CCSprite* pb = CCSprite::create("Back.jpg");
- pb->setPosition(center);
- this->addChild(pb, 0);
- // 480x320 此图为使用于设计分辨率 LsSize 的图片
- CCSprite* pSprite = CCSprite::create("HelloWorld.png");
- pSprite->setPosition(center);
- this->addChild(pSprite, 0);
- // 37x37 在 480x320 画面的四个拐角处,添加参照
- CCSprite* p1 = CCSprite::create("Peas.png");
- p1->setPosition(ccpAdd(center, ccp(-240, -160)));
- this->addChild(p1);
- CCSprite* p2 = CCSprite::create("Peas.png");
- p2->setPosition(ccpAdd(center, ccp(240, 160)));
- this->addChild(p2);
- CCSprite* p3 = CCSprite::create("Peas.png");
- p3->setPosition(ccpAdd(center, ccp(-240, 160)));
- this->addChild(p3);
- CCSprite* p4 = CCSprite::create("Peas.png");
- p4->setPosition(ccpAdd(center, ccp(240, -160)));
- this->addChild(p4);



- CCDirector *pDirector = CCDirector::sharedDirector();
- pDirector->setContentScaleFactor(
- CCEGLView::sharedOpenGLView()->getScaleY() );
- CCSize frameSize = CCEGLView::sharedOpenGLView()->getFrameSize();
- // 设置 LsSize 固定值
- CCSize lsSize = CCSizeMake(480, 320);
- float scaleX = (float) frameSize.width / lsSize.width;
- float scaleY = (float) frameSize.height / lsSize.height;
- // 定义 scale 变量
- float scale = 0.0f; // MAX(scaleX, scaleY);
- if (scaleX > scaleY) {
- // 如果是 X 方向偏大,那么 scaleX 需要除以一个放大系数,放大系数可以由枞方向获取,
- // 因为此时 FrameSize 和 LsSize 的上下边是重叠的
- scale = scaleX / (frameSize.height / (float) lsSize.height);
- } else {
- scale = scaleY / (frameSize.width / (float) lsSize.width);
- }
- CCLog("x: %f; y: %f; scale: %f", scaleX, scaleY, scale);
- // 根据 LsSize 和屏幕宽高比动态设定 WinSize
- CCEGLView::sharedOpenGLView()->setDesignResolutionSize(lsSize.width * scale,
- lsSize.height * scale, kResolutionNoBorder);


- // 这里先简单实现思路
- CCScene* HelloWorld::scene() {
- CCScene *scene = CCScene::create();
- // 创建背景层
- CCLayer* b = CCLayer::create();
- scene->addChild(b);
- // 添加背景图片和设置位置,可以使用其它装饰,或者小图片屏幕都行
- CCSize size = CCDirector::sharedDirector()->getWinSize();
- CCPoint center = ccp(size.width/2, size.height/2);
- CCSprite* pb = CCSprite::create("Back.jpg");
- pb->setPosition(center);
- b->addChild(pb, 0);
- // 创建 LsLayer 层
- HelloWorld *lsLayer = HelloWorld::create();
- scene->addChild(lsLayer);
- return scene;
- }
- // 在 HelloWorld 中重写 visit() 函数 设定显示区域
- void HelloWorld::visit() {
- glEnable(GL_SCISSOR_TEST); // 开启显示指定区域
- // 在这里只写上固定值,在特性环境下,以便快速看效果,实际的值,需要根据实际情况算得
- glScissor(20, 0, 480, 320); // 只显示当前窗口的区域
- CCLayer::visit(); // 调用下面的方法
- glDisable(GL_SCISSOR_TEST); // 禁用
- }

Cocos2D-X屏幕适配新解的更多相关文章
- Cocos2d-x——Cocos2d-x 屏幕适配新解 – 兼容与扩展【转载】
Cocos2d-x 屏幕适配新解 – 兼容与扩展 本文出自[无间落叶](转载请保留出处):http://blog.leafsoar.com/archives/2013/05-13-08.html 在读 ...
- Cocos2d-x——Cocos2d-x 屏幕适配新解【转载】
Cocos2d-x 屏幕适配新解 本文出自[无间落叶](转载请保留出处):http://blog.leafsoar.com/archives/2013/05-10-19.html 为了适应移动终端的各 ...
- cocos2d-x 屏幕适配新解
转自:http://blog.leafsoar.com/archives/2013/05-10-19.html 为了适应移动终端的各种分辨率大小,各种屏幕宽高比,在 cocos2d-x(当前稳定版:2 ...
- Cocos2d-x 屏幕适配新解(比较全面比较详细)
本文出自 [无间落叶]原文地址:http://blog.leafsoar.com/archives/2013/05-10-19.html 为了适应移动终端的各种分辨率大小,各种屏幕宽高比,在 coco ...
- Cocos2d-JS的屏幕适配方案
Cocos2d引擎为游戏开发者提供了屏幕适配策略(Resolution Policy)解决方案. 使用方式 1. 设置屏幕适配策略(Resolution Policy) 如果你还没有用过Resolut ...
- 关于Unity中的屏幕适配
一.Game视图的屏幕分辨率可以先自定义添加,供以后选择,以下是手游经常用到的分辨率: 1.1136X640,iPhone5 2.1920X1080,横屏,主流游戏都是这个分辨率 3.1080X192 ...
- Android屏幕适配笔记
1.限定符 为了适配不同屏幕大小的android手机或android平板,有时候就需要利用限定符来为不同的屏幕设定不同的布局文件,在一般情况下我们都是在layout文件夹下为某个活动准备一个默认的布局 ...
- iOS开发点滴:iPhone屏幕适配
最近开始做iOS开发,遇到一些小问题和解决方法,记录下. 今天是iPhone屏幕适配 iPhone5出来之后屏幕就有iPhone就有了2种尺寸:3.5寸和4寸,xcode 5 的IB设计器里面界面 ...
- IOS开发之绝对布局和相对布局(屏幕适配)
之前如果做过Web前端页面的小伙伴们,看到绝对定位和相对定位并不陌生,并且使用起来也挺方便.在IOS的UI设计中也有绝对定位和相对定位,和我们的web前端的绝对定位和相对定位有所不同但又有相似之处.下 ...
随机推荐
- iOS 记录近期遇到的几个bug
1. actionSheet与pickerView 不兼容 发生环境:ios 9以上,其他无测试. actionSheet与pickerView在一起使用时,当actionSheet弹出后,紧接着再弹 ...
- win10 uwp 切换主题
本文主要说如何在UWP切换主题,并且如何制作主题. 一般我们的应用都要有多种颜色,一种是正常的白天颜色,一种是晚上的黑夜颜色,还需要一种辅助的高对比颜色.这是微软建议的,一般应用都要包含的颜色. 我们 ...
- JSTL标签库的基本教程之核心标签库(一)
JSTL介绍 Java Server Pages Standard Tag Libray(JSTL):JSP标准标签库,它封装了JSP应用的通用核心功能.JSTL支持通用的.结构化的任务,比如迭代,条 ...
- linux 生成随机密码和wordlist常用方法
注:文章内容来自网络收集 关于下面这10个方法,估计很多人也知道了,这里也是为了自己以后用收集一下,不过顺便吐槽下,google第一页,只要是“linux 随机密码”这几个类似的关键字,蹦出来的全特么 ...
- ubuntu中python3.4安装pip
这两天碰到在ubuntu中安装pip的问题. 第一种方法 用百度搜索了一下,基本上都是这个命令: sudo apt-get install python3-pip 但是,用这条命令下载速度特别慢. 第 ...
- Java基础笔记14
1.反射. Class:反射类 任何一个类都有一个Class反射类.(影子) java.lang.reflect.*; Field:字段类 Method:方法类类 Constructor:构造方法类. ...
- 前端开发:如何写一手漂亮的 Vue
前几日听到一句生猛与激励并存,可怕与尴尬同在,最无奈也无解的话:"90后,你的中年危机已经杀到".这令我很受触动.显然,这有些夸张了,但就目前这日复一日的庸碌下去,眨眼的功夫,那情 ...
- ubuntu-17.10 安装 FANN
因为想用C语言写神经网络,不用已有的库的话,又太难了,所以准备安装一个夸平台的FANN库, 源文件下载地址http://leenissen.dk/fann/wp/download/,我下载的是最新 ...
- 分布式数据库TiDB的部署
转自:https://my.oschina.net/Kenyon/blog/908370 一.环境 CentOS Linux release 7.3.1611 (Core)172.26.11.91 ...
- Problem P
题意:FJ养牛,他想知道中间的牛是那一头: 思路:这道题有点水,思路就不写了 #include #include #include #define maxn 10005 using namespace ...