原帖子地址:http://cn.cocos2d-x.org/tutorial/show?id=1186

在这个文章中原作者已经说的很清楚,我在这个其他改动一些适用我项目中需求

1.满足Web和Native一套工程:为了维护方便

2.检测更新每天只执行一次:每次打开会等待,一天打开多次会卡多次。这个改动只适合自己的

AssetsManager 类:

  1. var __failCount = 0;
  2. toFix = function(num, length) {
  3. return ('' + num).length < length ? ((new Array(length + 1)).join('0') + num).slice(-length) : '' + num;
  4. };
  5. var AssetsManagerLoaderScene = cc.Scene.extend({
  6. _am:null,
  7. _progress:null,
  8. _percent:0,
  9. _percentByFile:0,
  10. _progressText : "",
  11. run:function(){
  12. if (!cc.sys.isNative){
  13. this.loadGame();
  14. return;
  15. }
  16. else{
  17. var myDate = new Date();
  18. var year = myDate.getFullYear();
  19. var month = toFix(myDate.getMonth() + 1,2);
  20. var day = toFix(myDate.getDate(),2);
  21. var nowDate = year + "" + month + "" + day;
  22. var lastDate = cc.sys.localStorage.getItem("kAssetsDate");
  23. //一天只检测一次
  24. if(parseInt(nowDate) > parseInt(lastDate)
  25. || lastDate == null
  26. || lastDate == undefined
  27. || lastDate == ""){
  28. cc.sys.localStorage.setItem("kAssetsDate",nowDate);
  29. }
  30. else{
  31. this.loadGame();
  32. return;
  33. }
  34. }
  35. var layer = new cc.Layer();
  36. this.addChild(layer);
  37. this._progressText = "升级中 ";
  38. if(cc.sys.language == cc.sys.LANGUAGE_ENGLISH){
  39. this._progressText = "UPDATING ";
  40. }
  41. this._progress = new cc.LabelTTF(this._progressText +"0.00%", "Arial", 40);
  42. this._progress.x = cc.winSize.width / 2;
  43. this._progress.y = cc.winSize.height / 2 + 50;
  44. layer.addChild(this._progress);
  45. // android: /data/data/com.huanle.magic/files/
  46. var storagePath = (jsb.fileUtils ? jsb.fileUtils.getWritablePath() : "/");
  47. cc.log("AssetsManagerLoaderScene storagePath="+storagePath);
  48. this._am = new jsb.AssetsManager("res/project.manifest", storagePath);
  49. this._am.retain();
  50. if (!this._am.getLocalManifest().isLoaded())
  51. {
  52. cc.log("Fail to update assets, step skipped.");
  53. this.loadGame();
  54. }
  55. else
  56. {
  57. //            cc.log("packageUrl = "+);
  58. var that = this;
  59. var listener = new jsb.EventListenerAssetsManager(this._am, function(event) {
  60. cc.log("listener................");
  61. switch (event.getEventCode()){
  62. case jsb.EventAssetsManager.ERROR_NO_LOCAL_MANIFEST:
  63. cc.log("No local manifest file found, skip assets update.");
  64. that.loadGame();
  65. break;
  66. case jsb.EventAssetsManager.UPDATE_PROGRESSION:
  67. that._percent = event.getPercent();
  68. that._percentByFile = event.getPercentByFile();
  69. cc.log(that._percent + "%");
  70. var msg = event.getMessage();
  71. if (msg) {
  72. cc.log(msg);
  73. }
  74. break;
  75. case jsb.EventAssetsManager.ERROR_DOWNLOAD_MANIFEST:
  76. case jsb.EventAssetsManager.ERROR_PARSE_MANIFEST:
  77. cc.log("Fail to download manifest file, update skipped.");
  78. that.loadGame();
  79. break;
  80. case jsb.EventAssetsManager.ALREADY_UP_TO_DATE:
  81. case jsb.EventAssetsManager.UPDATE_FINISHED:
  82. cc.log("Update finished.");
  83. that.loadGame();
  84. break;
  85. case jsb.EventAssetsManager.UPDATE_FAILED:
  86. cc.log("Update failed. " + event.getMessage());
  87. __failCount ++;
  88. if (__failCount < 5)
  89. {
  90. that._am.downloadFailedAssets();
  91. }
  92. else
  93. {
  94. cc.log("Reach maximum fail count, exit update process");
  95. __failCount = 0;
  96. that.loadGame();
  97. }
  98. break;
  99. case jsb.EventAssetsManager.ERROR_UPDATING:
  100. cc.log("Asset update error: " + event.getAssetId() + ", " + event.getMessage());
  101. //                        that.loadGame();
  102. break;
  103. case jsb.EventAssetsManager.ERROR_DECOMPRESS:
  104. cc.log(event.getMessage());
  105. that.loadGame();
  106. break;
  107. default:
  108. break;
  109. }
  110. });
  111. cc.eventManager.addListener(listener, 1);
  112. this._am.update();
  113. cc.director.runScene(this);
  114. }
  115. this.schedule(this.updateProgress, 0.5);
  116. },
  117. loadGame:function(){
  118. cc.log("loadGame");
  119. if (cc.sys.isNative){
  120. cc.loader.loadJs(["src/files.js"], function(err){
  121. cc.loader.loadJs(jsFiles, function(err){
  122. cc.LoaderScene.preload(g_resources, function () {
  123. cc.director.runScene(new MainScene());
  124. }, this);
  125. });
  126. });
  127. }
  128. else{
  129. cc.LoaderScene.preload(g_resources, function () {
  130. cc.director.runScene(new MainScene());
  131. }, this);
  132. }
  133. },
  134. updateProgress:function(dt){
  135. this._progress.string = this._progressText + this._percent.toFixed(2)+"%";//"" + this._percent;
  136. },
  137. onExit:function(){
  138. cc.log("AssetsManager::onExit");
  139. this._am.release();
  140. this._super();
  141. }
  142. });

cocos2d-js 热更新模块 使用AssetsManager的更多相关文章

  1. 【Quick 3.3】资源脚本加密及热更新(三)热更新模块

    [Quick 3.3]资源脚本加密及热更新(三)热更新模块 注:本文基于Quick-cocos2dx-3.3版本编写 一.介绍 lua相对于c++开发的优点之一是代码可以在运行的时候才加载,基于此我们 ...

  2. Cocos2d-js 热更新学习笔记

    转载至: http://blog.csdn.net/pt_xxj/article/details/68927705 为什么还要再写一篇关于cocos2d js热更新的笔记,最单纯的想法就是记录心得,另 ...

  3. webpack开启本地服务器与热更新

    第一个webpack本地服务 webpack本地服务相关的一些操作指令与应用 一.第一个webpack本地服务 //工作区间 src//文件夹 index.js//入口文件 index.css//测试 ...

  4. React Native拆包及热更新方案 · Solartisan

    作者:solart 版权声明:本文图文为博主原创,转载请注明出处. 随着 React Native 的不断发展完善,越来越多的公司选择使用 React Native 替代 iOS/Android 进行 ...

  5. 轻松理解webpack热更新原理

    一.前言 - webpack热更新 Hot Module Replacement,简称HMR,无需完全刷新整个页面的同时,更新模块.HMR的好处,在日常开发工作中体会颇深:节省宝贵的开发时间.提升开发 ...

  6. Webpack与Vite热更新差异对比

    随着项目的日渐迭代,项目整体的代码量也会越来越多,从而导致项目体积越来越大:在Webpack时代,很多人会对历史项目(巨型项目)感到头疼,因为往往巨型项目在本地开发调试的时候会因为本地代码的修改触发H ...

  7. 另类Unity热更新大法:代码注入式补丁热更新

    对老项目进行热更新 项目用纯C#开发的? 眼看Unity引擎热火朝天,无数程序猿加入到了Unity开发的大本营. 一些老项目,在当时ulua/slua还不如今天那样的成熟,因此他们选择了全c#开发:也 ...

  8. Lua热更新时正确设置文件名

    Lua热更新时正确设置文件名(金庆的专栏 2016.12)Lua热更新模块见:https://github.com/jinq0123/hotfix其中使用 load(chunk) 来加载更新后的内容, ...

  9. 内核补丁热更新ceph内核模块

    前言 内核模块的更新一般需要卸载模块再加载,但是很多时候使用场景决定了无法做卸载的操作,而linux支持了热更新内核模块的功能,这个已经支持了有一段时间了,一直没有拿ceph的相关模块进行验证 准备工 ...

随机推荐

  1. 算法练习3---水仙花数java版

    所谓 "水仙花数 "是指一个三位数,其各位数字立方和等于该数本身. java程序代码如下: public class ArithTest { public static void ...

  2. 1009 失恋的小 T(后缀数组¥)

    1009: 失恋的小 T 时间限制: 1 Sec  内存限制: 128 MB提交: 160  解决: 76[提交][状态][讨论版] 题目描述 小 T 最近失恋了,开始怀疑人生和爱情,他想知道在这世界 ...

  3. Git之(一)Git是什么[转]

    为什么使用Git 孔子曾经曰过的,名正则言顺 言顺则事成. 我们在学习一项新技术之前,弄清楚为什么要学它至关重要,至于为什么要学习Git,我用一段if-else语句告诉你原因: if(你相信我){ 我 ...

  4. RK30SDK开发板驱动分析(二):DDR频率配置

    在内核配置界界面,我们可以很容易的配置DDR的频率,300M OR 600M, so easy! 那么它是如何起作用的呢? 回想 RK30SDK开发板驱动分析(一) 末尾提到MACHINE_START ...

  5. JProfiler连接weblogic

    转 http://blog.csdn.net/xu1314/article/details/7737236

  6. (转)Android 弹软键盘时listview的变化控制

    本文转自于:http://blog.csdn.net/hellohaifei/article/details/9377483 问题描述:界面中有三部分,上面是标题栏,中间是Listview,下面是输入 ...

  7. idea使用git上传项目到coding

    1.VCS -> import into version control -> create git repository 2.选择要上传的项目根目录 3.选择后,项目里的文件名字变成了绿 ...

  8. Java 代码复用 —— 泛型

    public interface Comparable<T> { public int compareTo(T o); } 1. 接口(Comparable:可比较接口) public s ...

  9. MySql数据库约束

    <MySQL技术内幕:InnoDB存储引擎>本书从源代码的角度深度解析了InnoDB的体系结构.实现原理.工作机制,并给出了大量实践,本着将书读薄的思想,循序渐进的记录对本书学习的读书笔记 ...

  10. Java String Split Method

    Java String.split() method 有如下几种特殊情况: 1. 分隔符出现在首尾 public static void main(String args[]) { String St ...