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前端的绝对定位和相对定位有所不同但又有相似之处.下 ...
随机推荐
- spring mvc 多线程并发
ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简洁地编写出优美的多线程程序. http://www.xuebuyuan.com/1628190.html 我们 ...
- Java继承--子父类中的构造函数
子父类中的构造函数的特点: 1.在子类构造对象时,发现,访问子类构造函数时,父类构造函数也运行了. 原因是:在子类的构造函数中第一行有一个默认的隐式语句. super(); 类似于this(); ...
- SQL升级Oracle挖的Null坑,你懂的!
最近公司做系统数据库升级,主要由原来的SQL数据库升级Oracle数据库,对于拥有千万级数据库的实用系统来说,迁移不是件容易的时,光数据同步就需要很久,更别说要修改升级原来的SQL库使用的存储过程和视 ...
- 关于使用连接器arm-linux-ld时指定链接地址的作用
首先,记住一句话:程序的链接地址必须等于运行地址! 在学习exynos 4412的启动过程时,发现自己对链接地址的作用不是很了解,于是上网查找了资料做了基本了解,在此做个总结. 上图是exynos 4 ...
- 设置vim的默认工作路径同时与自动设当前编辑的文件所在目录为当前工作路径不冲突
问题: 想让vim自动设当前编辑的文件所在目录为当前工作路径不冲突,但是当vim新建文件的时候,工作路径会又自动切换缓存path下. 如何使当使用vim打开文件时,vim的工作路径是当前文件所在的路径 ...
- OOAD-设计模式(四)结构型模式之适配器、装饰器、代理模式
前言 前面我们学习了创建型设计模式,其中有5中,个人感觉比较重要的是工厂方法模式.单例模式.原型模式.接下来我将分享的是结构型模式! 一.适配器模式 1.1.适配器模式概述 适配器模式(Adapter ...
- spring MVC 环境搭建
绿色版Spring MVC(单纯的springMVC) 一.导包,为了获取请求数据多添加一个包 二.web.xml配置 <?xml version="1.0" encodin ...
- struts2(五)之struts2拦截器与自定义拦截器
前言 前面介绍了struts2的输入验证,如果让我自己选的话,肯定是选择xml配置校验的方法,因为,能使用struts2中的一些校验规则,就无需自己编写了, 不过到后面应该都有其他更方便的校验方法,而 ...
- 【经验分享】Trachtenberg system(特拉亨伯格速算系统)
二战期间,俄国的数学家Jakow Trachtenberg(1888-1953)被关进纳粹集中营,在狱中,他开发出了一套心算算法,这套算法后来被命名为Trachtenberg(特拉亨伯格)速算系统. ...
- java读写锁ReadWriteLock
package com.java.concurrent; import java.util.concurrent.locks.ReadWriteLock; import java.util.concu ...