原帖子地址: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. hdu 5239 Doom(线段树)

    Doom Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)Total Sub ...

  2. Python正则表达式之 - ?: / ?= / ?!

    Python正则表达式之 - ?: / ?= / ?! 用圆括号将所有选择项括起来,相邻的选择项之间用|分隔.但用圆括号会有一个副作用,使相关的匹配会被缓存,此时可用?:放在第一个选项前来消除这种副作 ...

  3. .NET和Docker ,比翼双飞

    DockerCon 2019本周将在旧金山举行 ,DockerCon 是从业者.贡献者.维护者.开发者和容器生态系统学习.网络和创新的一站式活动. .NET 团队博客发布了<一起使用.NET和D ...

  4. MySQL管理

    http://www.yiibai.com/mysql/administration.html 在本节中,您将学习有关MySQL管理教程,包括MySQL服务器启动和关闭,MySQL服务器安全性,MyS ...

  5. 2018.7.19 AK22 续集

    话说上次坏机检查没有找到问题,后来我们联合软件工程师一起分析原因 ------------------------ 在线调试: MCU在内部晶振模式下:初始化正常,功能函数正常,切换到外部晶振12M后 ...

  6. CodeForces - 803F: Coprime Subsequences(莫比乌斯&容斥)

    Let's call a non-empty sequence of positive integers a1, a2... ak coprime if the greatest common div ...

  7. 基于spring及zookeeper的dubbo工程搭建

    一.生产者搭建 新建一个maven工程,勾选Create a simple project Packaging方式选择jar包的方式. 修改pom.xml文件: <project xmlns=& ...

  8. linux swap交换分区说明/管理

    https://coolnull.com/3699.html 一.SWAP说明1.1 SWAP概述当系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用.那些被释 ...

  9. Dockerfile 部署应用执行脚本文件

    FROM centos6.6:0.0.1 MAINTAINER syberos:wangmo RUN mv /etc/yum.repos.d/ /etc/yum.repos.d_bak/ && ...

  10. python3 之logging模块

    logging.getLogger(name=None)Return a logger with the specified name or, if name is None, return a lo ...