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前端的绝对定位和相对定位有所不同但又有相似之处.下 ...
随机推荐
- UVa1630,Folding
区间dp,记忆化搜就可以 st为原串 dp[p][q]存st[p]~st[q]的最优长度,f[p][q]存对应的最优串 从(0,len-1)开始搜,f[0][len-1]为所求ans,回溯条件为p== ...
- Linux 快捷键汇总(偏基础)
自己最近才搭上Linux末班车,有一种想见恨晚的感觉,完全给你一种快速清爽的感觉! 因为需要,所以学习,记录自己在使用Linux系统上的点滴,偏基础! 1. 打开终端: Ctrl+Alt+T 2. 复 ...
- Kotlin——最详细的环境搭建
众所周知,Kotlin出来已经有一段时间了.Kotlin有着众多优势,不管是用于Android开发中,还是Java开发,都能缩减很大的代码量,大大提高了工作效率.而小生本人也是才从忙碌的个工作中抽身出 ...
- Java基础总结--流程控制
Java流程控制* 顺序结构--最常见的执行情况,语句按照出现的先后次序依次执行.* 判断结构--对条件进行判断,执行相应的语句.有三种常见的形式< if(判断条件){语句;}--为真执行语句, ...
- LeetCode 561. Array Partition I (数组分隔之一)
Given an array of 2n integers, your task is to group these integers into n pairs of integer, say (a1 ...
- vue 起步走 --“安装篇”
在说明之前,溶解得在这说一句 ,菜鸟开始安装这些东西真是不容易,各种疯狂的百度,搜索.(找的我眼泪都快流下来了),不说废话,开始正经. 第一步:环境的搭建 : vue推荐开发环境: Node.js: ...
- B树,B+树,B*树
参考资料 http://www.cnblogs.com/Bob-FD/archive/2012/06/20/2556505.html 第一节.B树.B+树.B*树 1.前言: 动态查找树主要有:二叉查 ...
- Hive中常用的查询命令
日志数据的统计处理在这里反倒没有什么特别之处,就是一些 SQL 语句而已,也没有什么高深的技巧,不过还是列举一些语句示例,以示 hive 处理数据的方便之处,并展示 hive 的一些用法. a) ...
- JDBC(MySQL)一周学习总结(二)
上一篇文章我们总结了获取数据库连接以及操作数据表的一些知识点,本篇将继续上次的文章给大家分享! 1. 上一篇文章我们可以对数据表进行增删改查的操作了,对与一些小项目的部分功能我们也足以胜任.但现在有一 ...
- CentOS7安装配置vncserver
系统环境:CentOS Linux release 7.4.1708 Kernel:3.10.0-693.el7.x86_64 系统现状:最小化安装,没有安装任何图形支持软件 安装图形化支持 不建议安 ...