1. --local MainSceneConfig = require "res.scripts.configs.MainSceneConfig" -- 暂时添加一个临时配置文件
  2. --require "res.scripts.scenes.MainScene"
  3.  
  4. -- 加载事件
  5. OnLoadingStart = "OnLoadingStart";
  6. OnLoadingProcess = "OnLoadingProcess";
  7. OnLoadingEnd = "OnLoadingEnd";
  8.  
  9. -- 加载类型
  10. SOUNDTYPE = "sounds";
  11. TEXTURETYPE = "textures";
  12. ATLASTYPE = "atlas";
  13. ANIMATIONTYPE = "animations";
  14. EFFECTTYPE = "effects";
  15.  
  16. -- 加载控制逻辑
  17. local LoadingController = class("LoadingController", Behavior);
  18.  
  19. function LoadingController:ctor(sceneName)
  20. LoadingController.super.ctor(self);
  21.  
  22. -- 定义成员变量
  23. self.progress = ; -- 加载进度
  24. self.totalLoadingNum = ; --加载总数数量
  25. self.curLoadingNum = ; -- 当前加载数量
  26. self.loadingConfig = ""; -- 资源配置文件
  27.  
  28. self.log = nil; -- 加载界面log
  29. self.btmLabel = nil; --进度显示标签
  30. self.uiLayout = nil; -- 加载界面布局
  31. self.uiLayer = nil; -- 加载界面层
  32. self.curScene = nil; -- 上一个场景
  33. self.nextScene = nil; -- 下一个场景
  34. self.config = res[sceneName];-- 配置文件
  35. self.curSceneName = sceneName;
  36.  
  37. self.isLoaded = false;
  38.  
  39. -- 随机抽取一只怪物
  40. local animKeys = table.keys(res.animations);
  41. if #animKeys > then
  42. local index = math.random(, #animKeys);
  43. self.animName = tostring(animKeys[index]);
  44. self.loadingxml = res.animations[self.animName];
  45. self.loadingplist = string.gsub(self.loadingxml, ".xml", ".plist")
  46. self.loadingpng = string.gsub (self.loadingxml, ".xml", ".png")
  47. end
  48. end
  49.  
  50. function LoadingController:run( )
  51. self.curScene = SceneM.getRunningScene();
  52. self.nextScene = nil;
  53.  
  54. -- 1.ui
  55. self.uiLayer = ObjectFactory.newLayer();
  56. self.uiLayer:setColor(ccc3(, , ));
  57.  
  58. -- 2.创建构成加载场景的元素
  59. self.btmLabel = ObjectFactory.newBMFontLabel({text = "Loading 0%", font = res.fonts.UIFont,})
  60. self.btmLabel:setPosition(ccp(Screen.cx, Screen.cy - ));
  61. self.uiLayer:addChild(self.btmLabel);
  62. if self.loadingxml then
  63. CCArmatureDataManager:sharedArmatureDataManager():addArmatureFileInfoAsync(self.loadingpng, self.loadingplist, self.loadingxml, function ( )
  64. if self.isLoaded then
  65. return;
  66. end
  67. local lion = ObjectFactory.newArmature(self.animName);
  68. lion:setPosition(ccp(Screen.cx,Screen.cy));
  69. lion:addParent(self.uiLayer);
  70. lion:getComponent("Animation"):play("run", WrapMode.Loop);
  71. end)
  72. end
  73.  
  74. -- 3. 添加到场景
  75. SceneM.dontDestroy(self.uiLayer);
  76.  
  77. -- 4. 关掉触摸消息
  78. CCDirector:sharedDirector():getTouchDispatcher():setDispatchEvents(false);
  79.  
  80. -- 5. 关掉动作管理
  81. CCDirector:sharedDirector():getActionManager():removeAllActions();
  82.  
  83. -- 6. 退出当前场景
  84. if self.curScene then
  85. self.curScene:setVisible(false);
  86. end
  87.  
  88. -- 7. 重新初始化管理类
  89. SceneM.uiLayers = {};
  90.  
  91. -- 8.延迟清除当前资源,并且加载下一个场景资源
  92. performWithDelay(function ( )
  93. self:cleanup();
  94. self:startLoading(self.config);
  95. end, 0.01)
  96.  
  97. -- 9. 回收lua内存
  98. collectgarbage("collect")
  99. end
  100.  
  101. function LoadingController:startLoading(theloadingconfig)
  102. if theloadingconfig == nil then
  103. self.isLoaded = true;
  104. -- 切换场景
  105. self.nextScene = ObjectFactory.newScene(self.curSceneName);
  106. SceneM.curScene = self.nextScene;
  107. self.nextScene:addComponent(self.curSceneName,SceneM.getSceneController(self.curSceneName));
  108.  
  109. -- 关闭加载层
  110. SceneM.destroy(self.uiLayer);
  111.  
  112. -- 开启触摸消息
  113. CCDirector:sharedDirector():getTouchDispatcher():setDispatchEvents(true);
  114.  
  115. -- 记录配置文件路径
  116. SceneM.lastSceneName = self.curSceneName;
  117.  
  118. -- 切换到新场景
  119. SceneM.replaceScene(self.nextScene, "crossfade", 0.2, Screen.COLOR_WHITE);
  120. return;
  121. end
  122. print ("start loading")
  123. self.loadingConfig = theloadingconfig;
  124. local resTypes = {"sounds","textures","atlas","animations","effects"}
  125. local curIndex = ;
  126. -- 1.开始当前场景加载资源
  127. self.curLoadingNum =
  128. local totalNum =
  129. local function loopRes( t , resType)
  130. if self.curLoadingNum > self.totalLoadingNum then
  131. return;
  132. end
  133. if t == nil then
  134. curIndex = curIndex + ;
  135. local resType = resTypes[curIndex];
  136. print("加载类型:",resType);
  137. print("加载:",theloadingconfig[resType]);
  138. loopRes(theloadingconfig[resType], resType);
  139. return;
  140. end
  141. local keys = table.keys(t);
  142. totalNum = totalNum + #keys;
  143. local tempIndex = ;
  144. local function loadRes( )
  145. self.curLoadingNum = self.curLoadingNum + ;
  146. if self.curLoadingNum > self.totalLoadingNum then
  147. return;
  148. end
  149. --print("====",self.curLoadingNum , totalNum)
  150. if self.curLoadingNum > totalNum then
  151. tempIndex = ;
  152. curIndex = curIndex + ;
  153. local resType = resTypes[curIndex];
  154. self.curLoadingNum = self.curLoadingNum - ;
  155. loopRes(theloadingconfig[resType], resType);
  156. return;
  157. end
  158. local key = keys[tempIndex];
  159. local value = t[key];
  160. tempIndex = tempIndex + ;
  161. if (tolua.type(value) == "table") then
  162. loopRes( value );
  163. elseif (tolua.type(value) == "string") then
  164. if resType == SOUNDTYPE then
  165. -- 1.异步声音加载
  166. --print("加载声音:", value);
  167. Audio.preloadEffect(value);
  168. performWithDelay(function ( )
  169. loadRes();
  170. end, CCDirector:sharedDirector():deltaTime())
  171. end
  172.  
  173. if resType == TEXTURETYPE then
  174. -- 2.异步纹理加载
  175. --print("加载纹理:", value);
  176. CCTextureCache:sharedTextureCache():addImageAsync(value, function ( )
  177. self:CheckedResLoaded(); -- 检测下是否加载完毕
  178. performWithDelay(function ( )
  179. loadRes();
  180. end, CCDirector:sharedDirector():deltaTime())
  181. end);
  182. end
  183.  
  184. if resType == ATLASTYPE then
  185. -- 2.异步纹理加载
  186. local png = string.gsub(value, ".plist", ".png")
  187. --print("加载图集:",png);
  188. CCTextureCache:sharedTextureCache():addImageAsync(png, function ( )
  189. -- 添加plist CCSpriteFrameCache
  190. CCSpriteFrameCache:sharedSpriteFrameCache():addSpriteFramesWithFile(value)
  191. self:CheckedResLoaded(); -- 检测下是否加载完毕
  192. performWithDelay(function ( )
  193. loadRes();
  194. end, CCDirector:sharedDirector():deltaTime())
  195. end);
  196. end
  197.  
  198. if resType == ANIMATIONTYPE or resType == EFFECTTYPE then
  199. --3.异步动画加载
  200. local plist = string.gsub(value, ".xml", ".plist")
  201. local png = string.gsub (value, ".xml", ".png")
  202. --print("加载骨骼动画:",png, plist, value);
  203. CCArmatureDataManager:sharedArmatureDataManager():addArmatureFileInfoAsync(png, plist, value, function ( )
  204. self:CheckedResLoaded(); -- 检测下是否加载完毕
  205. performWithDelay(function ( )
  206. loadRes();
  207. end, CCDirector:sharedDirector():deltaTime())
  208. end)
  209. end
  210. end
  211. end
  212.  
  213. loadRes();
  214. end
  215. -- 计算加载的资源总数
  216. local function size( config )
  217. return #table.keys(config.textures)
  218. + #table.keys(config.sounds)
  219. + #table.keys(config.fonts)
  220. + #table.keys(config.animations)
  221. + #table.keys(config.atlas)
  222. + #table.keys(config.effects);
  223. end
  224. self.totalLoadingNum = size(theloadingconfig);
  225.  
  226. -- 加载场景资源
  227. local resType = resTypes[curIndex];
  228. print("加载类型:",resType);
  229. print("加载:",theloadingconfig[resType]);
  230. loopRes(theloadingconfig[resType], resType);
  231. end
  232.  
  233. -- 检测是否加载完毕
  234. function LoadingController:CheckedResLoaded( )
  235. if self.curLoadingNum <= self.totalLoadingNum then
  236. -- 1.更新当前进度
  237. local percent = math.modf(self.curLoadingNum * / self.totalLoadingNum)
  238. self.btmLabel:setString(string.format("Loading %s%%", percent));
  239. end
  240.  
  241. -- 2.检测下是否加载完毕
  242. if (self.curLoadingNum == self.totalLoadingNum) then
  243. local function onComplete(event)
  244. print ("loading res finished!")
  245. self.isLoaded = true;
  246. -- 切换场景
  247. self.nextScene = ObjectFactory.newScene(self.curSceneName);
  248. SceneM.curScene = self.nextScene;
  249. self.nextScene:addComponent(self.curSceneName,SceneM.getSceneController(self.curSceneName));
  250.  
  251. -- 关闭加载层
  252. SceneM.destroy(self.uiLayer);
  253.  
  254. -- 开启触摸消息
  255. CCDirector:sharedDirector():getTouchDispatcher():setDispatchEvents(true);
  256.  
  257. -- 记录配置文件路径
  258. SceneM.lastSceneName = self.curSceneName;
  259.  
  260. -- 切换到新场景
  261. SceneM.replaceScene(self.nextScene, "crossfade", 0.2, Screen.COLOR_WHITE);
  262. end
  263. -- 等待一帧 不然最后一次无法绘制
  264. performWithDelay(onComplete, CCDirector:sharedDirector():deltaTime() * );
  265. end
  266. end
  267.  
  268. -- 清理资源
  269. function LoadingController:cleanup( )
  270. CCDirector:sharedDirector():getActionManager():removeAllActions();
  271. -- 获得上一个场景配置,根据配置删除
  272. if SceneM.lastSceneName then
  273. local lastConfig = res[SceneM.lastSceneName];
  274. local function removeRes( t , resType)
  275. if t == nil or type(t) ~= "table" then
  276. return;
  277. end
  278. for key, value in pairs(t) do
  279. if (tolua.type(value) == "table") then
  280. loopRes( value );
  281. elseif (tolua.type(value) == "string") then
  282. if resType == SOUNDTYPE then
  283. -- 1.删除声音
  284. Audio.unloadSound(value);
  285. end
  286.  
  287. if resType == TEXTURETYPE then
  288. -- 2.删除纹理
  289. CCTextureCache:sharedTextureCache():removeTextureForKey(value);
  290. end
  291.  
  292. if resType == ATLASTYPE then
  293. -- 3.删除plist纹理
  294. CCSpriteFrameCache:sharedSpriteFrameCache():removeSpriteFramesFromFile(value);
  295. value = string.gsub(value, ".plist", ".png");
  296. CCTextureCache:sharedTextureCache():removeTextureForKey(value);
  297. end
  298.  
  299. if resType == ANIMATIONTYPE then
  300. -- 4.删除动画
  301. print("删除骨骼动画资源:",value);
  302. value = string.gsub(value, ".xml", ".png");
  303. CCTextureCache:sharedTextureCache():removeTextureForKey(value);
  304. value = string.gsub(value, ".png", ".plist");
  305. CCSpriteFrameCache:sharedSpriteFrameCache():removeSpriteFramesFromFile(value);
  306. --CCArmatureDataManager:purge();
  307. end
  308. end
  309. end
  310. end
  311. removeRes(lastConfig.sounds, SOUNDTYPE); --删除声音资源
  312. removeRes(lastConfig.textures, TEXTURETYPE); --删除纹理资源
  313. removeRes(lastConfig.atlas, ATLASTYPE); --删除图集资源
  314. removeRes(lastConfig.animations, ANIMATIONTYPE); --删除动画资源
  315. removeRes(lastConfig.effects, ANIMATIONTYPE); --删除动画资源
  316.  
  317. -- 移除临时动态公共资源
  318. if ResM.tempPathCache then
  319. removeRes(ResM.tempPathCache.sounds, SOUNDTYPE); --删除声音资源
  320. removeRes(ResM.tempPathCache.textures, TEXTURETYPE); --删除纹理资源
  321. removeRes(ResM.tempPathCache.atlas, ATLASTYPE); --删除图集资源
  322. removeRes(ResM.tempPathCache.animations, ANIMATIONTYPE); --删除动画资源
  323. end
  324. ResM.init();
  325.  
  326. CCTextureCache:sharedTextureCache():dumpCachedTextureInfo();
  327. end
  328.  
  329. -- CCSpriteFrameCache:purgeSharedSpriteFrameCache();
  330. -- CCTextureCache:sharedTextureCache():removeAllTextures();
  331. -- CCArmatureDataManager:purge();
  332. end
  333.  
  334. return LoadingController;

LoadingController的更多相关文章

  1. ionic LoadingController 模块使用

    html 代码: <ion-header> <ion-navbar> <ion-title>Loading</ion-title> </ion-n ...

  2. 游戏Loading中的小提示和Loading动画实现

    学习unity1年多了,工作也1年了,因为工作需要,有几个月没接触unity Ngui啦. 学的还是不踏实.继续努力吧.由于下周就要进行新游戏的开发,这几天熟悉熟悉NGUI,今天按照现在公司以前的项目 ...

  3. ionic3 Loading组件的用法

    import { LoadingController } from 'ionic-angular'; @Component({ selector: 'page-contact', templateUr ...

  4. ionic2 rc2 添加版本更新自动升级功能

    不废话,直接上代码 首先安装四个必备的插件: cordova plugin add cordova-plugin-app-version //获取APP版本 cordova plugin add co ...

  5. ionic3 Injectable 引入NavController

    在service里 引入 navcontroller 报错 And I get error No provider for NavController. 一个比较容易解决的方法, import {Io ...

  6. Unity Chan 2D Asset

    Unity Chan 2D Asset 4月份時,UNITY CHAN 官方網站推出了3D大島こはく,之後也有更新1.11版,而在六月12日時,則釋出了2D版本素材,一樣可以在UNITY CHAN 官 ...

  7. ionic 访问odoo11之具体业务类api接口

    在前面测试通过odoo登录的功能,这次的问题重点是如何访问后台具体的业务类的接口呢?这次就以我们在odoo中安装的lunch模块为例,目标是获取lunch.alert的数据,如下图 具体过程接上次文章 ...

  8. ionic访问odoo 11接口

    在架设完毕odoo 11的网站之后,第一次面临手机app该如何访问后台网站的问题,是不是模式类似asp.net mvc 那样的模式,或者还存在其他的访问方法,带着这个疑问与困惑,开始的我的研究学习之路 ...

  9. Ionic2 播放mp3功能实现

    在开发app的过程中有需要播放mp3的功能,一直想实现,但苦于具体的困难一直未能实现,经过一段时间的资料查询和测试,最终摸索出来,现记录如下: 1.最重要的是安装第三方插件ionic-audio,开源 ...

随机推荐

  1. 【TP3.2.*】解决session过期不失效 和 设置不成功问题

    // ---------- 更新与 2019/01/23日 -------------// 1.问题:本来我想设置session有效期1800秒即30分钟 失效的,可是实际使用TP3.2.0的时候发现 ...

  2. linux vi 删除一行,复制一行命令,删除所有空白行

    删除所有空白行(^是行的开始,\s*是零个或者多个空白字符:$是行尾) :g/^\s*$/d 删除一行: dd 复制一行: yy ,之后是要 p 才会贴上来的.

  3. rviz学习笔记(一)——Markers: Sending Basic Shapes (C++) 发送基础形状

    一.创建一个包——进行marker练习 1.创建ROS工作空间和包 mkdir -p ~/catkin_ws/src #创建工作空间目录 #创建ROS数据包 catkin_create_pkg usi ...

  4. HDU 2227 Find the nondecreasing subsequences (数状数组)

    Find the nondecreasing subsequences Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/3 ...

  5. SpringBoot中Redis的set、map、list、value、实体类等基本操作介绍

    今天给大家介绍一下SpringBoot中Redis的set.map.list.value等基本操作的具体使用方法 上一节中给大家介绍了如何在SpringBoot中搭建Redis缓存数据库,这一节就针对 ...

  6. io分析神器blktrace

    一.概述 [许久之前就用过blktrace,现整理如下] 从linux 一个完整的IO入手分析: 一个I/O请求进入block layer之后,可能会经历下面的过程: Remap: 可能被DM(Dev ...

  7. Linux安装ElasticSearch-2.2.0

    1.下载ElasticSearch-2.2.0安装包 https://www.elastic.co/downloads/elasticsearch 2.安装ElasticSearch-2.2.0 rp ...

  8. Android逆向之旅---破解&quot;穿靴子的猫&quot;游戏的收费功能

    一.游戏收费分析 游戏收费非常正常的,可是玩游戏最恶心的就是你还没玩就要充值,非常恼火,事实上我不怎么玩游戏,主要是给小孩子们弄,比方如今好多小屁孩们喜欢玩水果忍者这个游戏.可是这个游戏在没有開始玩的 ...

  9. SQL Server 索引重建脚本

    在数据的使用过程中,由于索引page碎片过多,带来一些不利的性能问题,我们有时候需要对数据库中的索引进行重组或者重建工作.通常这个阈值为30%,大于30%我们建议进行索引重建,小于则进行重组操作.以下 ...

  10. [转]Spring注解-@Configuration注解、@Bean注解以及配置自动扫描、bean作用域

    1.@Configuration标注在类上,相当于把该类作为spring的xml配置文件中的<beans>,作用为:配置spring容器(应用上下文) package com.test.s ...