PoolMgr.ts 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. const { ccclass, property } = cc._decorator;
  2. @ccclass
  3. export default class PoolMgr {
  4. //单例模式---------------------------
  5. private static instance: PoolMgr = null;
  6. public static get Inst(): PoolMgr {
  7. if (!PoolMgr.instance) {
  8. PoolMgr.instance = new PoolMgr();
  9. }
  10. return PoolMgr.instance;
  11. }
  12. /**对象池预支体目录 */
  13. private nodePoolDir: string = "game/otherGame/prefab/nodepool/"
  14. private className: string = "";
  15. /**
  16. * 对象池预制体字典
  17. * @param key:string 预制体名字
  18. * @param valuee:cc.Prefab 预制体
  19. */
  20. public prefabDic: { [key: string]: cc.Prefab } = {};
  21. /**
  22. * 对象池字典
  23. * @param key:string 预制体名字
  24. * @param valuee:cc.NodePool 对应的对象池
  25. */
  26. public nodePoolDic: { [key: string]: cc.NodePool } = {};
  27. // LIFE-CYCLE CALLBACKS:
  28. onLoad() {
  29. }
  30. start() {
  31. }
  32. /**初始化对象池的预制体 */
  33. initPoolPrefab() {
  34. let self = this;
  35. //FC:获取当前类名
  36. self.className = self["__proto__"]["constructor"].name;
  37. //LogUtil.log("Object.keys(POOLPREFABTYPE)", Object.keys(NODEPOOLPREFABTYPE));
  38. // LogUtil.log("POOLPREFABTYPE[key]", typeof (POOLPREFABTYPE[POOLPREFABTYPE.Dart]));
  39. for (var i = 0; i < Object.keys(NODEPOOLPREFABTYPE).length; i++) {
  40. let key = Object.keys(NODEPOOLPREFABTYPE)[i];
  41. let value = NODEPOOLPREFABTYPE[key];
  42. //LogUtil.log("key", key)
  43. //FC:注释
  44. // if (Number(key) || Number(key) == 0) {
  45. // //LogUtil.log("key", key);
  46. // // LogUtil.log("value", value);
  47. // //初始化对象池
  48. // if (!self.nodePoolDic[value]) {
  49. // self.nodePoolDic[value] = new cc.NodePool();
  50. // }
  51. // LogUtil.log("加载预制体啦啦啦啦啦啦啦啦啦啦啦啦")
  52. // //加载预制体
  53. // cc.loader.loadRes(`${this.nodePoolDir}${value}`, function (err, prefab: cc.Prefab) {
  54. // if (err) {
  55. // LogUtil.log(`[${self.className}]加载预制体失败:${value}`, err);
  56. // }
  57. // else {
  58. // LogUtil.log(`[${self.className}]加载预制体成功:${value}`,prefab);
  59. // //初始化预制体
  60. // self.prefabDic[value] = prefab;
  61. // //实例化预制体
  62. // let nodePoolPrefab = cc.instantiate(prefab);
  63. // self.nodePoolDic[value].put(nodePoolPrefab);
  64. // }
  65. // }.bind(this));
  66. // }
  67. // else {
  68. // continue;
  69. // }
  70. //FC:应对遍历不到数字型Key值问题
  71. if (Number(key) || Number(key) == 0) {
  72. continue;
  73. }
  74. else {
  75. //LogUtil.log("[PoolMgr] key", key);
  76. // LogUtil.log("value", value);
  77. //初始化对象池
  78. if (!self.nodePoolDic[key]) {
  79. self.nodePoolDic[key] = new cc.NodePool();
  80. }
  81. //LogUtil.log("加载预制体啦啦啦啦啦啦啦啦啦啦啦啦")
  82. //加载预制体
  83. cc.loader.loadRes(`${this.nodePoolDir}${key}`, function (err, prefab: cc.Prefab) {
  84. if (err) {
  85. mk.console.log(`[${self.className}]加载预制体失败:${key}`, err);
  86. }
  87. else {
  88. //LogUtil.log(`[${self.className}]加载预制体成功:${key}`, prefab);
  89. //初始化预制体
  90. self.prefabDic[key] = prefab;
  91. //实例化预制体
  92. let nodePoolPrefab = cc.instantiate(prefab);
  93. self.nodePoolDic[key].put(nodePoolPrefab);
  94. }
  95. }.bind(this));
  96. }
  97. }
  98. }
  99. /**初始化预制体根据数目(有些可能需要初始生成大量的预制体)
  100. * @param poolPrefabType 对象池预制体的类型
  101. * @param initNum 需要的数量
  102. */
  103. async initPoolPrefabByNum(poolPrefabType: NODEPOOLPREFABTYPE, initNum: number) {
  104. let prefabName = NODEPOOLPREFABTYPE[poolPrefabType];
  105. let prefab = await this.getPoolPrefab(poolPrefabType);
  106. //可能有些一开始要生成大量的预制体
  107. for (let i = 0; i < initNum; ++i) {
  108. let nodePoolPrefab = cc.instantiate(prefab); // 创建节点
  109. this.nodePoolDic[prefabName].put(nodePoolPrefab); // 通过 put 接口放入对象池
  110. }
  111. }
  112. /**获取对象池的预制体
  113. * @param poolPrefabType 对象池预制体的类型
  114. */
  115. async getPoolPrefab(poolPrefabType: NODEPOOLPREFABTYPE) {
  116. let prefabName = NODEPOOLPREFABTYPE[poolPrefabType];
  117. let nodePoolPrefab: cc.Node = null;
  118. let prefab: cc.Prefab = this.prefabDic[prefabName];
  119. //如果有加载好的预制体
  120. if (prefab) {
  121. let nodePool: cc.NodePool = this.nodePoolDic[prefabName];
  122. if (nodePool.size() > 0) { // 通过 size 接口判断对象池中是否有空闲的对象
  123. nodePoolPrefab = nodePool.get();
  124. } else { // 如果没有空闲对象,也就是对象池中备用对象不够时,我们就用 cc.instantiate 重新创建
  125. nodePoolPrefab = cc.instantiate(prefab);
  126. }
  127. //LogUtil.log("hairPrefab",hairPrefab);
  128. return nodePoolPrefab;
  129. }
  130. else {
  131. let value = NODEPOOLPREFABTYPE[poolPrefabType];
  132. mk.console.log("poolPrefabType", poolPrefabType, value);
  133. let prefab = await mk.loader.load(`${this.nodePoolDir}${value}`, cc.Prefab);
  134. nodePoolPrefab = cc.instantiate(prefab);
  135. mk.console.log(" nodePoolPrefab ", nodePoolPrefab);
  136. return nodePoolPrefab;
  137. // cc.loader.loadRes(`${this.nodePoolDir}${value}`, function (err, prefab: cc.Prefab) {
  138. // if (err) {
  139. // mk.console.log("加载预制体失败level", err);
  140. // }
  141. // else {
  142. // nodePoolPrefab = cc.instantiate(prefab);
  143. // mk.console.log(" nodePoolPrefab ", nodePoolPrefab);
  144. // return nodePoolPrefab;
  145. // }
  146. // }.bind(this));
  147. }
  148. }
  149. /**回收对象池的预制体
  150. * @param poolPrefabType 对象池预制体的类型
  151. * @param nodePoolPrefab 预制体对象
  152. */
  153. recyclePoolPrefab(poolPrefabType: NODEPOOLPREFABTYPE, nodePoolPrefab: cc.Node) {
  154. let prefabName = NODEPOOLPREFABTYPE[poolPrefabType];
  155. let nodePool: cc.NodePool = this.nodePoolDic[prefabName];
  156. nodePool.put(nodePoolPrefab);
  157. }
  158. }
  159. /**对象池预制体的枚举值(对应枚举名数组) */
  160. export enum NODEPOOLPREFABTYPE {
  161. /**金币 */
  162. CellItem = 0,
  163. /**选择CellItem按钮 */
  164. SelectCellItemBtn = 1,
  165. /**爆炸 */
  166. Baozha = 2,
  167. /**方块背景 */
  168. CellBg = 3,
  169. /**消除得分 */
  170. EliminateScore = 4,
  171. /**Bonus提示 */
  172. BonusTip = 5,
  173. /**得分能量 */
  174. ScoreEnergy = 6,
  175. /**锤子特效 */
  176. Hammer = 7,
  177. /**变化特效 */
  178. Change = 8,
  179. /**提示item */
  180. TipItemUI = 10,
  181. /**目标达成 */
  182. GetTargetScoreTip = 11,
  183. /**得分 */
  184. GetScore = 13,
  185. /**图片提示item */
  186. TipSpriteItemUI = 14,
  187. }