Cocos2d引擎为游戏开发者提供了屏幕适配策略(Resolution Policy)解决方案。

使用方式

1. 设置屏幕适配策略(Resolution Policy)

  如果你还没有用过Resolution Policy,只需要在游戏载入过程完成之后(cc.game.onStart函数回调中),调用下面的代码:

cc.view.setDesignResolutionSize(320, 480, cc.ResolutionPolicy.SHOW_ALL);

  setDesignResolutionSize函数的前两个参数是你想要在你的代码中使用的游戏分辨率,第三个参数就是你选择的适配方案。引擎中内置了5种适配方案

  如果你已经设置了设计分辨率,那么你可以直接设置你的Resolution Policy:

cc.view.setResolutionPolicy(cc.ResolutionPolicy.NO_BORDER);

  原生游戏中游戏总是使用全部屏幕空间,但是在WEB端你的网页中也许除了游戏还有别的视觉或文字元素,或者也许你需要给你的游戏设计一个漂亮的边框。所以 Cocos2d-JS中Web引擎的适配方案会默认适配游戏Canvas元素的父节点,如果你希望游戏场景适配浏览器屏幕,那么只需要将Canvas直接 放置到body下就可以了

2. Resolution Policy的意义

使用Resolution Policy的好处很明显,不论设备屏幕大小如何,也不论浏览器窗口的宽高比,你的游戏场景都会被自动放缩到屏幕大小。更重要的是,在游戏代码中,你将永 远使用你所设计的游戏分辨率来布置游戏场景。比如说,如果你将设计分辨率设置为320 * 480,那么在游戏代码中你的游戏窗口右上角坐标将永远是(320, 480)(在FIXED_WIDTH模式高度可能会被缩放,同样在FIXED_HEIGHT模式下宽度可能存在缩放的情况,具体看下文说明)。

3. 监听浏览器窗口大小变化事件

新的适配方案允许在浏览器大小变化的时候自动重新尝试适配。比如说,当用户拖拽来改变浏览器大小,或者更有用的情况,当他们转动自己手机方向的时候。游戏中任意时刻都可以开启这种行为,只需要调用cc.viewresizeWithBrowserSize函数:

cc.view.resizeWithBrowserSize(true);

为了更灵活得应对变化,我们为cc.view提供了一个新的函数,你可以通过setResizeCallback函数注册一个回调函数来监听浏览器窗口大小变化事件:

cc.view.setResizeCallback(function() {
// 做任何你所需要的游戏内容层面的适配操作
// 比如说,你可以针对用户的移动设备方向来决定所要应用的适配模式
});

4. Fullscreen API

Fullscreen API是浏览器允许Web页面在获得用户全屏幕的一个新的制定中的API。

Cocos2d-JS在移动端浏览器中会尝试自动进入全屏幕来给用户更好的游戏体验(需要指出并不是所有浏览器都支持这个API)。

另一方面,桌面端几乎所有现代浏览器都支持Fullscreen API,如果你希望使用这个API,Cocos2d-JS也简化了它的使用方式:

  • 尝试进入全屏模式(需要用户交互): cc.screen.requestFullScreen(targetElement, onFullScreenCallback);
  • 检测是否处于全屏模式: cc.screen.fullScreen();
  • 退出全屏模式: cc.screen.exitFullScreen();

重要概念

  1. 游戏外框 Frame

    游戏外框是你的游戏Canvas元素的初始父节点,一般情况下,它是html文档的body元素。但是如果你愿意,它可以是DOM结构中的任意容器节点。Canvas元素的初始大小并不重要,屏幕适配过程中它会被自动放缩来适应你设置的外框大小。 再次提醒,如果你希望游戏窗口适应整个浏览器窗口,那么只需要将Canvas元素直接放在body下。

  2. 游戏容器 Container

    在Cocos2d-JS的初始化进程中,引擎会自动将你的Canvas元素放置到一个DIV容器中,而这个容器会被加入到Canvas的原始父节点(游戏外框)中。这个游戏容器是实现屏幕适配方案的重要辅助元素,你可以通过cc.container来访问它。

  3. 游戏世界 Content

    游戏世界代表游戏内使用的世界坐标系。

  4. 视窗 Viewport

    视窗是游戏世界相对于游戏Canvas元素坐标系中的坐标及大小.

  5. 容器适配策略 Container Strategy

    容器适配策略负责对游戏容器和游戏Canvas元素进行放缩以适应游戏外框。

  6. 内容适配策略 Content Strategy

    内容适配策略负责将游戏世界放缩以适应游戏容器,同时也会计算并设置视窗。

系统预设适配模式

  在Cocos2d-JS中预设了5种适配模式,下面将图解每种适配模式的行为。图中红色方框指示的是游戏世界的边界,而绿色方框指示的是Canvas元素的边界。

所有适配模式都是由一个容器适配策略搭配一个内容适配策略所组成的,括号中显示的是每个模式的构成方式。

  1. SHOW_ALL (PROPORTION_TO_FRAME + SHOW_ALL)

    SHOW_ALL模式会尽可能按原始宽高比放大游戏世界以适配外框(Frame),同时使得游戏内容全部可见,所以浏览器宽高比不同于游戏宽高比时,窗口中会有一定的留白。留白部分的颜色或背景可以通过设置外框的CSS属性来修改。

 

  2. NO_BORDER (EQUAL_TO_FRAME + NO_BORDER)

    NO_BORDER模式会尽可能按原始宽高比放大游戏世界以适配外框,并且保证不留空白。所以浏览器宽高比不同于游戏宽高比时,游戏世界会被部分切割。同时,在这种情况下,cc.visibleRect代表的就是Canvas在游戏世界中的视窗,大小比cc.winSize要小一些。

  3. EXACT_FIT (EQUAL_TO_FRAME + EXACT_FIT)

    EXACT_FIT模式会忽略原始宽高比放大游戏世界以完全适应外框,所以浏览器宽高比不同于游戏宽高比时,游戏世界会被一定程度拉伸。    

    FIXED_WIDTH模式会横向放大游戏世界以适应外框的宽度,纵向按原始宽高比放大。结果有两种可能,类似与SHOW_ALL模式的结果(如 图),或者类于NO_BORDER模式。它与前面两种模式的差别在于,在FIXED_WIDTH模式下游戏世界坐标系等同于Canvas元素坐标系,并且 Canvas元素必然占满整个外框。

    注意下与SHOW_ALL模式的区别,此时Canvas大小是整个外框大小,所以可显示内容区域实际上比SHOW_ALL模式更多。

  5. FIXED_HEIGHT (EQUAL_TO_FRAME + FIXED_HEIGHT)    

    与前一个模式相反,FIXED_HEIGHT模式会纵向放大游戏世界以适应外框的高度,横向按原始宽高比放大。结果同上。

    在这个模式下,与NO_BORDER模式的区别是此时游戏世界坐标系和大小等同于Canvas坐标系。

用系统预设策略来构建适配模式

如你所看到的,所有预设模式都是预设策略的组合,你也可以做到同样的事情,系统预设策略如下所示:

  Container strategies: 容器适配策略

    cc.ContainerStrategy.EQUAL_TO_FRAME // 使容器大小等同于外框
cc.ContainerStrategy.PROPORTION_TO_FRAME // 使容器大小按原始宽高比放大以适应外框
cc.ContainerStrategy.ORIGINAL_CONTAINER // 原始容器大小

  Content strategies 内容适配策略

    cc.ContentStrategy.SHOW_ALL
cc.ContentStrategy.NO_BORDER
cc.ContentStrategy.EXACT_FIT
cc.ContentStrategy.FIXED_WIDTH
cc.ContentStrategy.FIXED_HEIGHT

Cocos2d-JS的屏幕适配方案的更多相关文章

  1. JavaScript强化教程 —— Cocos2d-JS的屏幕适配方案

    1. 设置屏幕适配策略(Resolution Policy) 如果你还没有用过Resolution Policy,只需要在游戏载入过程完成之后(cc.game.onStart函数回调中),调用下面的代 ...

  2. Unity2D多分辨率屏幕适配方案(转载)

    一下内容转自:http://imgtec.eetrend.com/forum/3992 此文将阐述一种简单有效的Unity2D多分辨率屏幕适配方案,该方案适用于基于原生开发的Unity2D游戏,即没有 ...

  3. cocos2dx屏幕适配方案

    我们在利用cocos2dx来开发游戏时,在开始时就不可避免的会遇到屏幕适配问题,来使我们的游戏适应移动终端的各种分辨率大小.目前,大家采用的屏幕适配方案不一,网上的资料也比较丰富,下面我也将自己使用的 ...

  4. [原创]一种Unity2D多分辨率屏幕适配方案

    此文将阐述一种简单有效的Unity2D多分辨率屏幕适配方案,该方案适用于基于原生开发的Unity2D游戏,即没有使用第三方2D插件,如Uni2D,2D toolkit等开发的游戏,NGUI插件不受这个 ...

  5. Android 屏幕适配方案

    转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/45460089: 本文出自:[张鸿洋的博客] 1.概述 大家在Android开发 ...

  6. 实用Android 屏幕适配方案分享

    转载地址:http://blog.csdn.net/gao_chun/article/details/45645051 真正可用,并且简单易行,可以在多个屏幕大小和屏幕密度上有良好表现的Android ...

  7. 给你一个全自动的屏幕适配方案(基于SW方案)!—— 解放你和UI的双手

    Calces系列相关文章:Calces自动实现Android组件化模块构建 前言 屏幕适配一直是移动端开发热议的问题,但是适配方案往往在实际开发的时候会和UI提供的设计稿冲突.本文主要是基于官方推荐的 ...

  8. Web 端屏幕适配方案

    基础知识 像素相关 1.像素 :像素是屏幕显示最小的单位. 2.设备像素 :设备像素又称物理像素(physical pixel),设备能控制显示的最小单位,我们可以把这些像素看作成显示器上一个个的点. ...

  9. Flutter实战视频-移动电商-11.首页_屏幕适配方案讲解

    11.首页_屏幕适配方案讲解 国人写的屏幕适配插件: https://github.com/OpenFlutter/flutter_screenutil 最新版本是0.5.1 在pubspec.yam ...

随机推荐

  1. Java编程思想学习(五) 复用类

    1.继承与组合 复用类的方法有两种:继承与组合.继承就不多说了,组合就是直接在类中new一个对象. 数组也是对象,使用数组也是组合的一种. 2.初始化基类 当创建一个导出类的对象时,该对象包含一个基类 ...

  2. poj3207 2-SAT入门

    一开始题意没读懂 = = 题意:比如说对于表盘上a到b.c到d都要连边,这两个边不能交叉.这两个边要么都在圆内要么都在圆外,而且可以是曲线= = 比如这种情况:(Reference:http://bl ...

  3. mint锁屏设置

    心血来潮,给笔记本装了linux,版本是当下最火的mint.唔,使用体验不错-下面记录的是修改mint锁屏相关设置的修改方式. In Linux Mint 13, the screen lock fe ...

  4. jquery------提供灵活的方法参数

    index.jsp <h1 >再次重逢的世界</h1> my.js $(document).ready(function(){ (function($){ $.fn.shado ...

  5. Spring IoC、DI入门小程序

    Alt+/智能提示xml配置文件节点及属性:在接口上使用Ctrl+T可以提示其实现类 一.IoC控制反转(将创建对象的权利交给spring)入门小程序 1.引入jar包 2.工程基本结构 3.新建Us ...

  6. ios 判断控制器是否是第一次进入画页的做法

    什么是第一次进入画页,只viewDidLoad一次: 所以只需要在viewDidLoad中加一个标识就行了. 加一个成员变量,或者属性,用来记录这个标识 一旦viewDidLoad后,这个就说明不是第 ...

  7. SQL防注入程序 v1.0

    /// ***************C#版SQL防注入程序 v1.0************ /// *使用方法: /// 一.整站防注入(推荐) /// 在Global.asax.cs中查找App ...

  8. Jquery 获取URL参数

    使用jquery获取url以及使用jquery获取url参数是我们经常要用到的操作 1.jquery获取url很简单,代码如下 1.window.location.href; 其实只是用到了javas ...

  9. window.document

    <title>无标题文档</title> </head> <body>例1:<br />今年是哪一年?<input type=&quo ...

  10. cocos基础教程(5)数据结构介绍之cocos2d::Map<K,V>

    1.概述 cocos2d::Map<K,V> 是一个内部使用了 std::unordered_map的关联容器模版. std::unordered_map 是一个存储了由key-value ...