cocos2d-js 热更新模块 使用AssetsManager
原帖子地址:http://cn.cocos2d-x.org/tutorial/show?id=1186
在这个文章中原作者已经说的很清楚,我在这个其他改动一些适用我项目中需求
1.满足Web和Native一套工程:为了维护方便
2.检测更新每天只执行一次:每次打开会等待,一天打开多次会卡多次。这个改动只适合自己的
AssetsManager 类:
- var __failCount = 0;
- toFix = function(num, length) {
- return ('' + num).length < length ? ((new Array(length + 1)).join('0') + num).slice(-length) : '' + num;
- };
- var AssetsManagerLoaderScene = cc.Scene.extend({
- _am:null,
- _progress:null,
- _percent:0,
- _percentByFile:0,
- _progressText : "",
- run:function(){
- if (!cc.sys.isNative){
- this.loadGame();
- return;
- }
- else{
- var myDate = new Date();
- var year = myDate.getFullYear();
- var month = toFix(myDate.getMonth() + 1,2);
- var day = toFix(myDate.getDate(),2);
- var nowDate = year + "" + month + "" + day;
- var lastDate = cc.sys.localStorage.getItem("kAssetsDate");
- //一天只检测一次
- if(parseInt(nowDate) > parseInt(lastDate)
- || lastDate == null
- || lastDate == undefined
- || lastDate == ""){
- cc.sys.localStorage.setItem("kAssetsDate",nowDate);
- }
- else{
- this.loadGame();
- return;
- }
- }
- var layer = new cc.Layer();
- this.addChild(layer);
- this._progressText = "升级中 ";
- if(cc.sys.language == cc.sys.LANGUAGE_ENGLISH){
- this._progressText = "UPDATING ";
- }
- this._progress = new cc.LabelTTF(this._progressText +"0.00%", "Arial", 40);
- 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() : "/");
- cc.log("AssetsManagerLoaderScene storagePath="+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
- {
- // cc.log("packageUrl = "+);
- var that = this;
- var listener = new jsb.EventListenerAssetsManager(this._am, function(event) {
- cc.log("listener................");
- 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.log("loadGame");
- if (cc.sys.isNative){
- cc.loader.loadJs(["src/files.js"], function(err){
- cc.loader.loadJs(jsFiles, function(err){
- cc.LoaderScene.preload(g_resources, function () {
- cc.director.runScene(new MainScene());
- }, this);
- });
- });
- }
- else{
- cc.LoaderScene.preload(g_resources, function () {
- cc.director.runScene(new MainScene());
- }, this);
- }
- },
- updateProgress:function(dt){
- this._progress.string = this._progressText + this._percent.toFixed(2)+"%";//"" + this._percent;
- },
- onExit:function(){
- cc.log("AssetsManager::onExit");
- this._am.release();
- this._super();
- }
- });
cocos2d-js 热更新模块 使用AssetsManager的更多相关文章
- 【Quick 3.3】资源脚本加密及热更新(三)热更新模块
[Quick 3.3]资源脚本加密及热更新(三)热更新模块 注:本文基于Quick-cocos2dx-3.3版本编写 一.介绍 lua相对于c++开发的优点之一是代码可以在运行的时候才加载,基于此我们 ...
- Cocos2d-js 热更新学习笔记
转载至: http://blog.csdn.net/pt_xxj/article/details/68927705 为什么还要再写一篇关于cocos2d js热更新的笔记,最单纯的想法就是记录心得,另 ...
- webpack开启本地服务器与热更新
第一个webpack本地服务 webpack本地服务相关的一些操作指令与应用 一.第一个webpack本地服务 //工作区间 src//文件夹 index.js//入口文件 index.css//测试 ...
- React Native拆包及热更新方案 · Solartisan
作者:solart 版权声明:本文图文为博主原创,转载请注明出处. 随着 React Native 的不断发展完善,越来越多的公司选择使用 React Native 替代 iOS/Android 进行 ...
- 轻松理解webpack热更新原理
一.前言 - webpack热更新 Hot Module Replacement,简称HMR,无需完全刷新整个页面的同时,更新模块.HMR的好处,在日常开发工作中体会颇深:节省宝贵的开发时间.提升开发 ...
- Webpack与Vite热更新差异对比
随着项目的日渐迭代,项目整体的代码量也会越来越多,从而导致项目体积越来越大:在Webpack时代,很多人会对历史项目(巨型项目)感到头疼,因为往往巨型项目在本地开发调试的时候会因为本地代码的修改触发H ...
- 另类Unity热更新大法:代码注入式补丁热更新
对老项目进行热更新 项目用纯C#开发的? 眼看Unity引擎热火朝天,无数程序猿加入到了Unity开发的大本营. 一些老项目,在当时ulua/slua还不如今天那样的成熟,因此他们选择了全c#开发:也 ...
- Lua热更新时正确设置文件名
Lua热更新时正确设置文件名(金庆的专栏 2016.12)Lua热更新模块见:https://github.com/jinq0123/hotfix其中使用 load(chunk) 来加载更新后的内容, ...
- 内核补丁热更新ceph内核模块
前言 内核模块的更新一般需要卸载模块再加载,但是很多时候使用场景决定了无法做卸载的操作,而linux支持了热更新内核模块的功能,这个已经支持了有一段时间了,一直没有拿ceph的相关模块进行验证 准备工 ...
随机推荐
- selenium-webdirver api-定位方式
1,8种单数定位方式 # 通过ID定位目标元素 driver.find_element_by_id('i1') # 通过className定位目标元素 driver.find_element_by_c ...
- mysql 完整约束
一 介绍 约束条件与数据类型的宽度一样,都是可选参数 作用:用于保证数据的完整性和一致性主要分为: PRIMARY KEY (PK) 标识该字段为该表的主键,可以唯一的标识记录 FOREIGN KEY ...
- python虚拟开发环境搭建(virtualenv和virtualenvwrapper)
虚拟开发环境的搭建 (0) 搭建虚拟环境的意义 使不同的开发环境独立 环境升级不影响其他开发环境,也不影响全局 防止包管理的混乱 (1) 指定 虚拟环境的创建目录 环境变量设置 创建 WORKON_H ...
- pthread_cond_wait() 前使用 while 讲解
pthread_cond_wait() 前使用 while 讲解 -- : LINUX环境下多线程编程肯定会遇到需要条件变量的情况,此时必然要使用pthread_cond_wait()函数.但这个函数 ...
- [基本操作] Mobius 反演, Dirichlet 卷积和杜教筛
Dirichlet 卷积是两个定义域在正整数上的函数的如下运算,符号为 $*$ $(f * g)(n) = \sum_{d|n}f(d)g(\frac{n}{d})$ 如果不强调 $n$ 可简写为 $ ...
- UVALive - 3490 Generator (AC自动机+高斯消元dp)
初始有一个空串s,从前n个大写字母中不断随机取出一个字母添加到s的结尾,出现模式串t时停止,求停止时s的长度期望. 这道题解法不唯一,比较无脑的方法是对模式串t建一个单串AC自动机,设u为自动机上的一 ...
- webpack里CommonJS的require与ES6 的module.exports加载模块有何不同
只需明白commonjs的规则即可,import会被转化为commonjs格式的,babel默认会把ES6的模块转化为commonjs规范的. import vue from 'vue'; //等价于 ...
- 自己写的工具:把Evernote(印象笔记)的笔记导入到博客(Blog)中
Evernote是个强大的工具, 这个伴随了我快4年的工具让我积累好多笔记.但是,如何把evernote(印象笔记)中的笔记发布到博客中呢? 自己空闲时候用python 3写了个工具Evernote2 ...
- 【HTML代码】访问页面时,拨打页面中的电话号码
这两天在写HTML页面今天要实现一个手机用户访问页面的时候,如果页面中有电话号码,点击可以打电话或者是发信息,之前没做过今天刚听说感觉很高大上会很难,实际上简单的让我内牛满面啊,, 小婊砸 (* ...
- Elasticsearch的过滤查询
声明:我使用的elasticsearch的版本是5.4.0,具体参考下面的链接 https://www.elastic.co/guide/en/elasticsearch/reference/5.4/ ...