原帖子地址: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. windows7安装PyQt5(通过pip install 安装)

    开始接触PyQt5 ,总结了一下安装的方法 默认各位已经安装好了Python环境 首先,确定一下之前没有安装过pyqt5,如果安装了,可以先卸载,避免出现意外, 之前装了几次没成功就是这种情况,卸载命 ...

  2. hbase_异常_04_util.FSUtils: Waiting for dfs to exit safe mode...

    一.异常现象 启动hbase的时,hbase的日志中可以发现: Waiting for dfs to exit safe mode... 然后就抛异常了 2018-03-22 17:00:28,994 ...

  3. PHP用mysql_insert_id()函数获得刚插入数据或当前发布文章的ID

    向mysql 插入数据时,很多时候我们想知道刚刚插入数据的id,这对我们很有用.下面这篇文章就详细给大家介绍了利用mysql_insert_id()函数获得刚插入数据或当前发布文章的ID,有需要的朋友 ...

  4. L123

    My heart, the bird of the wilderness, has found its sky in your eyes. 我的心是旷野的鸟,在你的双眼中找到了天空.His main ...

  5. Codeforces Round #286 (Div. 2)B. Mr. Kitayuta's Colorful Graph(dfs,暴力)

    数据规模小,所以就暴力枚举每一种颜色的边就行了. #include<iostream> #include<cstdio> #include<cstdlib> #in ...

  6. HihoCoder1465 重复旋律8(后缀自动机)

    描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一段音乐旋律可以被表示为一段数构成的数列. 小Hi发现旋律可以循环,每次把一段旋律里面最前面一个音换到最后面就成为了原旋律的“循环相似旋律”,还可以 ...

  7. 洛谷 P1655 小朋友的球

    题目描述 @发源于 小朋友最近特别喜欢球.有一天他脑子抽了,从口袋里拿出了N个不同的球,想把它们放到M个相同的盒子里,并且要求每个盒子中至少要有一个球,他好奇有几种放法,于是尝试编程实现,但由于他天天 ...

  8. 自定义Django Command

    转: django的command命令是要放在一个app的management/commands目录下.python2环境中,请确保management和management/commands目录内都 ...

  9. 最终还是选择了markdownpad2

    markdownpad2使用 最终 哈哈,最后还是选择了markdownpad2,经过探索才知道这个玩意多么好用. 点击,下载. 碰到的问题 1.win10出现HTML无法渲染得对话框 结果是,官网有 ...

  10. hdu 1028 && hdu 1398 && hdu 1085 && hdu 1171 ——生成函数

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1028 就是可以用任意个1.2.3....,所以式子写出来就是这样:(1+x+x^2+...)(1+x^2+ ...