这篇文档将介绍Cocos2d-JS 3.0的一个重量级新特性:资源管理器(仅支持JSB)。资源管理器是为游戏运行时的资源热更新而设计的,这里的资源可以是图片,音频甚至游戏脚本本身。使用资源管理器,你将可以上传新的资源到你的服务器,你的游戏会跟踪远程服务器上的修改,将新的资源下载到用户的设备上并在游戏中使用新的资源。就这样,全新的设计,新的游玩体验甚至全新的游戏内容都将立刻被推送到你的用户手上。重要的是,你不需要针对各个渠道去重新打包你的应用并经历痛苦的应用更新审核,这个过程没有任何成本!

使用场景

想象一下你的游戏已经发布在应用商店中,但是你突然发现一个设计上的疏漏或者一些非常负面的用户反馈,你肯定心急如焚,但是修改完成之后,还是不得不等待无数渠道的软件打包以及恼人的应用商店审核...直到通过审核上线,还需要用户去更新自己的软件版本,或者...审核也许通不过。看到这里,有如此经验的人心情一定不会好,我想说,这样的过程实在是太痛苦了,而且很多用户可能在这个过程中早已流失。

其他使用场景:

  • 情人节快到了,你想要组织一个游戏内活动,错过时机肯定是你最不想要看到的结果。
  • 当你发现一个严重的bug。
  • 当你想要添加一些新的场景或者关卡来延长游戏的生命。
  • 以及非常多其他的情况...

对于以上这些情况,如果你可以在开发完成后快速得部署到用户手上,我说的快速,是也许一个晚上,这难道不是很吸引人么?资源管理器就是为了这些情况而设计的。

特性

Cocos2d-JS v3.0 RC0版中的资源管理器新增了非常多强大的功能特性,使得热更新的过程更加快捷方便。

  • 多线程并行下载支持
  • 两层进度统计信息:文件级以及字节级
  • Zip压缩文件支持
  • 断点续传
  • 详细的错误报告
  • 文件下载失败重试支持

资源管理器的使用

实际上,使用资源管理器的使用相当简单,首先,你的应用包中将需要一个JSON格式的初始的配置文件(manifest)。

在这个配置文件中,你需要提供服务器上的对应配置文件地址,当前资源版本和一组资源描述,然后你就可以在游戏代码中使用jsb.AssetsManager的API来检查或更新对应资源的最新版本。

配置文件

下面是配置文件的一个简单示例:

{
"packageUrl" : "http://example.com/assets_manager/TestScene/",
"remoteVersionUrl" : "http://example.com/assets_manager/TestScene/version.manifest",
"remoteManifestUrl" : "http://example.com/assets_manager/TestScene/project.manifest",
"version" : "1.0.0",
"engineVersion" : "Cocos2d-JS v3.0 RC0", "assets" : {
"Images/background.jpg" : {
"md5" : "..."
},
"Images/icon.png" : {
"md5" : "..."
},
"Images/button.png" : {
"md5" : "..."
},
"src/game.js" : {
"md5" : "..."
},
"src/layer.js" : {
"md5" : "..."
},
"compressed.zip" : {
"md5" : "...",
"compressed" : true
}
}, "searchPaths" : [
"res/"
]
}
  • packageUrl : 远程资源的下载根路径。
  • remoteVersionUrl : 远程版本文件的路径,用来判断服务器端是否有新版本的资源。
  • remoteManifestUrl : 远程配置文件的路径,包含版本信息以及所有资源信息。
  • version : 配置文件对应的版本。
  • engineVersion : 配置文件对应的引擎版本。
  • assets : 所有资源信息。
    • key : 键代表资源的相对路径(相对于packageUrl)。
    • md5 : md5值代表资源文件的版本信息。
    • compressed : [可选项] 如果值为true,文件被下载后会自动被解压,目前仅支持zip压缩格式。
  • searchPaths : 需要添加到cocos2d引擎中的搜索路径列表。

版本文件version.manifest文件应该包含与配置文件完全相同的前五项信息。这个文件是可选的,如果它未被找到或成功失败,资源管理器会自动下载完整的配置文件。但是当配置文件包含很多资源非常庞大的时候,版本文件将极大缩短版本比较的时间。

使用jsb.AssetsManager

下面是jsb.AssetsManager使用的示例代码:

var manager = new jsb.AssetsManager(manifestUrl, storagePath);

manager.update();
// 由于下载过程是异步的,你需要增加manager的索引数以保证它不会被Cocos2d-x的内存管理释放掉
manager.retain(); if (!manager.getLocalManifest().isLoaded()) {
cc.log("Fail to update assets, step skipped.");
}
else {
var listener = new cc.EventListenerAssetsManager(manager, function(event) {
switch (event.getEventCode())
{
case cc.EventAssetsManager.ERROR_NO_LOCAL_MANIFEST:
cc.log("No local manifest file found, skip assets update.");
break;
case cc.EventAssetsManager.UPDATE_PROGRESSION:
var percent = event.getPercent();
var filePercent = event.getPercentByFile();
cc.log("Download percent : " + percent + " | File percent : " + filePercent);
break;
case cc.EventAssetsManager.ERROR_DOWNLOAD_MANIFEST:
case cc.EventAssetsManager.ERROR_PARSE_MANIFEST:
cc.log("Fail to download manifest file, update skipped.");
break;
case cc.EventAssetsManager.ALREADY_UP_TO_DATE:
case cc.EventAssetsManager.UPDATE_FINISHED:
cc.log("Update finished.");
// 由于增加了manager的引用计数,你需要在合适的时候将它释放掉,并确保这个对象不再被使用到
manager.release();
break;
case cc.EventAssetsManager.UPDATE_FAILED:
cc.log("Update failed. " + event.getMessage());
// 直接重新下载失败的资源,建议你对重试次数计数,超过一定次数放弃
manager.downloadFailedAssets();
break;
case cc.EventAssetsManager.ERROR_UPDATING:
cc.log("Asset update error: " + event.getAssetId() + ", " + event.getMessage());
break;
case cc.EventAssetsManager.ERROR_DECOMPRESS:
cc.log(event.getMessage());
break;
default:
break;
}
}
}

你也可以参考js-tests中的Extensions/AssetsManagerTest测试例。其他jsb.AssetsManager的API如下:

  • checkUpdate()
  • getState()
  • getStoragePath()
  • getLocalManifest()
  • getRemoteManifest()
已知bug

资源管理器可能会在windows和iOS模拟器上遇到无法创建并下载文件的问题,我们会尽快解决这个问题,与此同时,请使用iOS真机进行调试。

【cocos2d-js官方文档】二、资源管理器Assets Manager的更多相关文章

  1. bootbox.js官方文档中文版

    bootbox.js官方文档中文版简介:Bootbox.js是一个小型的JavaScript库,基于Bootstrap模态框开发,用于创建可编程的对话框. 不像原生的alert等对话框,所有的Boot ...

  2. Hui之Hui.js 官方文档

    基础 // 判断值是否是指定数据类型 var result = hui.isTargetType("百签软件", "string"); //=>true ...

  3. cassandra 3.x官方文档(4)---分区器

    写在前面 cassandra3.x官方文档的非官方翻译.翻译内容水平全依赖本人英文水平和对cassandra的理解.所以强烈建议阅读英文版cassandra 3.x 官方文档.此文档一半是翻译,一半是 ...

  4. Vue.js官方文档学习笔记(二)组件化应用的构建

    组件化应用的构建 组件化应用允许我们使用小型.独立和通常可复用的组件构建大型应用. Vue注册组件 Vue.component('todo-item',{template:'<li>这是个 ...

  5. node.js官方文档解析 02—buffer 缓冲器

    Buffer 类的实例类似于整数数组,但 Buffer 的大小是固定的.且在 V8 堆外分配物理内存.Buffer 的大小在被创建时确定,且无法调整. Buffer 类在 Node.js 中是一个全局 ...

  6. bootbox.js官方文档

    简介 Bootbox.js是一个小型的JavaScript库,基于Bootstrap模态框开发,用于创建可编程的对话框. 不像原生的alert等对话框,所有的Bootstrap模态框生成的都是非阻塞事 ...

  7. Node.js官方文档:到底什么是阻塞(Blocking)与非阻塞(Non-Blocking)?

    译者按: Node.js文档阅读系列之一. 原文: Overview of Blocking vs Non-Blocking 译者: Fundebug 为了保证可读性,本文采用意译而非直译. 这篇博客 ...

  8. node.js官方文档解析 01—assert 断言

    assert-------断言 new assert.AssertionError(options) Error 的一个子类,表明断言的失败. options(选项)有下列对象 message < ...

  9. node.js官方文档chm电子书的制作

    制作软件:WebCHMSetup2.22.zip,http://www.onlinedown.net/soft/31553.htm 制作好的电子书:Node.js(v6.10.2).zip 参考链接: ...

随机推荐

  1. servlet 接受和回复向服务器对客户端发起得请求

    servlet 接受和回复向服务器对客户端发起得请求

  2. ARC075 F.Mirrored

    题目大意:给定D,询问有多少个数,它的翻转减去它本身等于D 题解做法很无脑,利用的是2^(L/2)的dfs,妥妥超时 于是找到了一种神奇的做法. #include <iostream> u ...

  3. 安全警告——“Windows已经阻止此软件因为无法验证发行者”解决办法

    步骤:打开IE工具-->Internet选项-->安全-->自定义级别 -->找到ActiveX 控件和插件,按照图里进行配置.

  4. vector创建2维数组

    以前我要建立一个二维数组,总是使用 int N=5, M=6; vector<vector<int> > Matrix(N); for(int i =0; i< Matr ...

  5. 实际上ECMAScript中并没有对类的定义

    首先,我们用一个经典例子来简单阐述一下ECMAScript中的继承机制. 在几何学上,实质上几何形状只有两种,即椭圆形(是圆形的)和多边形(具有一定数量的边).圆是椭圆的一种,它只有一个焦点.三角形. ...

  6. Nginx的火速蔓延与其并发性处理优势

    Nginx是俄罗斯人编写的十分轻量级的HTTP服务器.Nginx,它的发音为“engine X”, 是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP 代理服务器.Ngi ...

  7. PAT团体程序设计大赛---(模拟)

    L1-1 古风排版(20 分) 中国的古人写文字,是从右向左竖向排版的.本题就请你编写程序,把一段文字按古风排版. 输入格式: 输入在第一行给出一个正整数N(<100),是每一列的字符数.第二行 ...

  8. nodejs npm insttall 带不带-g这个参数的区别

    -g 中的g是global的意思所以带-g这个参数是全局安装,不带-g这个参数是本地安装. 在windows系统中全局安装的目录在:C:\Users\linsenq\AppData\Roaming\n ...

  9. Spring学习--HelloWorld

    Spring: Spring 是一个开源框架. Spring 是为简化企业级应用开发而生,使用 Spring 可以使简单的 JavaBean 实现以前只有 EJB 才能实现的功能. Spring 是一 ...

  10. java封装的使用

    一:前言 其实以前我们来学习java特性的时候,对于封装好想觉得没什么用处,至少我那个时候的感觉(不知道是不是我学的太浅薄了~),现在由于项目从零开始做得,在做得过程中我感觉到原来封装是这样用的. 二 ...