1)添加启动scene文件---assetsManager.js,程序运行时首先加载AssetsManager场景,由AssetsManager对象检查是否有文件更新,有则下载文件(包括资源和脚本文件等)到本地的存储目录,之后由AssetsManager对象动态加载这些js、png等新的文件,最后启动程序。
AssetsManager类的代码如下:
- var __failCount = 0;
- var AssetsManager = cc.Scene.extend({
- _am:null,
- _progress:null,
- _percent:0,
- _percentByFile:0,
- run:function(){
- if (!cc.sys.isNative) {
- this.loadGame();
- return;
- }
- var layer = new cc.Layer();
- this.addChild(layer);
- this._progress = new cc.LabelTTF.create("下载进度:0%", "Arial", 12);
- this._progress.x = cc.winSize.width / 2;
- this._progress.y = cc.winSize.height / 2 + 50;
- layer.addChild(this._progress);
- // android: /data/data/com.huanle.magic/files/
- var storagePath = (jsb.fileUtils ? jsb.fileUtils.getWritablePath() : "./");// storagePath表示本地的存储目录,更新的文件将下载到此目录下,程序加载脚本和资源时,也将优先从此目录查询
- this._am = new jsb.AssetsManager("res/project.manifest", storagePath);
- this._am.retain();
- if (!this._am.getLocalManifest().isLoaded()){
- cc.log("Fail to update assets, step skipped.");
- this.loadGame();
- }else{
- var that = this;
- var listener = new jsb.EventListenerAssetsManager(this._am, function(event) {
- switch (event.getEventCode()){
- case jsb.EventAssetsManager.ERROR_NO_LOCAL_MANIFEST:
- cc.log("No local manifest file found, skip assets update.");
- that.loadGame();
- break;
- case jsb.EventAssetsManager.UPDATE_PROGRESSION:
- that._percent = event.getPercent();
- that._percentByFile = event.getPercentByFile();
- cc.log(that._percent + "%");
- var msg = event.getMessage();
- if (msg) {
- cc.log(msg);
- }
- break;
- case jsb.EventAssetsManager.ERROR_DOWNLOAD_MANIFEST:
- case jsb.EventAssetsManager.ERROR_PARSE_MANIFEST:
- cc.log("Fail to download manifest file, update skipped.");
- that.loadGame();
- break;
- case jsb.EventAssetsManager.ALREADY_UP_TO_DATE:
- case jsb.EventAssetsManager.UPDATE_FINISHED:
- cc.log("Update finished.");
- that.loadGame();
- break;
- case jsb.EventAssetsManager.UPDATE_FAILED:
- cc.log("Update failed. " + event.getMessage());
- __failCount ++;
- if (__failCount < 5){
- that._am.downloadFailedAssets();
- }else{
- cc.log("Reach maximum fail count, exit update process");
- __failCount = 0;
- that.loadGame();
- }
- break;
- case jsb.EventAssetsManager.ERROR_UPDATING:
- cc.log("Asset update error: " + event.getAssetId() + ", " + event.getMessage());
- that.loadGame();
- break;
- case jsb.EventAssetsManager.ERROR_DECOMPRESS:
- cc.log(event.getMessage());
- that.loadGame();
- break;
- default:
- break;
- }
- });
- cc.eventManager.addListener(listener, 1);
- this._am.update();
- cc.director.runScene(this);
- }
- this.schedule(this.updateProgress, 0.5);
- },
- loadGame:function(){
- cc.loader.loadJs(["files.js"], function(err){//首先动态加载files.js,注:该loadJs()函数加载files.js是优先从storagePath开始查找的
- if(err){
- cc.log("error:" + err);
- }else{
- cc.loader.loadJs(jsFiles, function(err1){//jsFiles是定义在files.js文件下的一个包含着所有更新过的js文件资源
- if(err1){
- cc.log("error:" + err1);
- }else{
- cc.director.runScene(new HelloWorldScene());
- }
- });
- }
- });
- },
- updateProgress:function(dt){
- this._progress.string = "下载进度:" + this._percent + "%";
- },
- onExit:function(){
- cc.log("AssetsManager::onExit");
- this._am.release();
- this._super();
- }
- });
*正确应为:jsb.EventListenerAssetsManager和jsb.AssetsManager,旧的官方文档给的好像是cc.EventListenerAssetsManager和cc.AssetsManager
2)修改项目目录下的main.js,将启动scene改为AssetsManager场景;
3)修改项目目录下的project.json对象,将jsList数组中所有可变化的js文件去掉,并加上1)步骤中创建的,记得加上extensions module代码如下:
- {
- ...
- "engineDir":"frameworks/cocos2d-html5",
- "modules" : ["cocos2d","extensions"],
- "jsList" : [
- "src/assetsManager.js"
- ]
- }
4) 项目res目录增加一个project.manifest文件,用于配置版本更新所需要的信息。
- {
- "packageUrl" : "http://192.168.125.107/fans",//更新包的下载地址,注意:如果是用本机作服务器的话最好用ip地址,不要用localhost
- "remoteManifestUrl" : "http://192.168.125.107/fans/project.manifest",//版本文件的更新地址,新版本更新后,本文件也要更新
- "remoteVersionUrl" : "http://192.168.125.107/fans/version.manifest",//版本文件的更新地址,版本文件是可选文件,只记录了版本信息,没有记录更新列表信息
- "version" : "1.0.0",//当前版本号
- "groupVersions" : {//这个我也不清楚
- "1" : "1.0.0"
- }
- }
到这里客户端配置就差不多了。
服务端配置:
5)配置版本文件version.manifest,只记录版本信息,客户端更新时首先下载该文件,并核对版本,如有更新再下载项目文件project.manifest,version.manifest只比project.manifest少了要更新的文件列表(见project.manifest结构),主要是为防止当要更新的文件较多时,减少核对版本的时间和流量。version.manifest结构如下:
- {
- "packageUrl" : "http://192.168.125.107/fans",
- "remoteManifestUrl" : "http://192.168.125.107/fans/project.manifest",
- "remoteVersionUrl" : "http://192.168.125.107/fans/version.manifest",
- "version" : "1.0.9",
- "groupVersions" : {
- "1" : "1.0.9"
- },
- "engineVersion" : "3.0 rc0",
- }
6) 配置版本文件 project.manifest,结构如下:
- {
- "packageUrl" : "http://192.168.125.107/fans",
- "remoteManifestUrl" : "http://192.168.125.107/fans/project.manifest",
- "remoteVersionUrl" : "http://192.168.125.107/fans/version.manifest",
- "version" : "1.0.9",
- "groupVersions" : {
- "1" : "1.0.9"
- },
- "engineVersion" : "3.0 rc0",
- "assets" : {
- "src/app.zip" : {//服务器下的待下载的文件名,文件fullname为“http://192.168.125.107/fans/src/app.zip”
- "md5" : "f6bf54e5a0d42c963cc5ae92bf9dc7c6",//记录该资源文件的版本信息,如果和本地该资源一样的话则不更新
- "compressed" : true,//是否解压
- "group" : "1"
- }
- },
- "searchPaths" : [
- "src/"//相对于客户端里面storagePath下的src子目录,程序加载资源时将优先从此查找 ]
- }