PoolMgr.ts 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. const { ccclass } = 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/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. // for (var e in POOLPREFABTYPE) {
  100. // LogUtil.log("e String", String(e));
  101. // LogUtil.log("e Number", Number(e));
  102. // }
  103. }
  104. /**初始化预制体根据数目(有些可能需要初始生成大量的预制体)
  105. * @param poolPrefabType 对象池预制体的类型
  106. * @param initNum 需要的数量
  107. */
  108. initPoolPrefabByNum(poolPrefabType: NODEPOOLPREFABTYPE, initNum: number) {
  109. let prefabName = NODEPOOLPREFABTYPE[poolPrefabType];
  110. let prefab = this.prefabDic[prefabName];
  111. //可能有些一开始要生成大量的预制体
  112. for (let i = 0; i < initNum; ++i) {
  113. let nodePoolPrefab = cc.instantiate(prefab); // 创建节点
  114. this.nodePoolDic[prefabName].put(nodePoolPrefab); // 通过 put 接口放入对象池
  115. }
  116. }
  117. /**获取对象池的预制体
  118. * @param poolPrefabType 对象池预制体的类型
  119. */
  120. getPoolPrefab(poolPrefabType: NODEPOOLPREFABTYPE) {
  121. let prefabName = NODEPOOLPREFABTYPE[poolPrefabType];
  122. let nodePoolPrefab: cc.Node = null;
  123. let prefab: cc.Prefab = this.prefabDic[prefabName];
  124. //如果有加载好的预制体
  125. if (prefab) {
  126. let nodePool: cc.NodePool = this.nodePoolDic[prefabName];
  127. if (nodePool.size() > 0) { // 通过 size 接口判断对象池中是否有空闲的对象
  128. nodePoolPrefab = nodePool.get();
  129. } else { // 如果没有空闲对象,也就是对象池中备用对象不够时,我们就用 cc.instantiate 重新创建
  130. nodePoolPrefab = cc.instantiate(prefab);
  131. }
  132. //LogUtil.log("hairPrefab",hairPrefab);
  133. return nodePoolPrefab;
  134. }
  135. else {
  136. let value = NODEPOOLPREFABTYPE[poolPrefabType];
  137. mk.console.log("poolPrefabType", poolPrefabType, value);
  138. cc.loader.loadRes(`${this.nodePoolDir}${value}`, function (err, prefab: cc.Prefab) {
  139. if (err) {
  140. mk.console.log("加载预制体失败level", err);
  141. }
  142. else {
  143. nodePoolPrefab = cc.instantiate(prefab);
  144. mk.console.log(" nodePoolPrefab ", nodePoolPrefab);
  145. return nodePoolPrefab;
  146. }
  147. }.bind(this));
  148. }
  149. }
  150. /**回收对象池的预制体
  151. * @param poolPrefabType 对象池预制体的类型
  152. * @param nodePoolPrefab 预制体对象
  153. */
  154. recyclePoolPrefab(poolPrefabType: NODEPOOLPREFABTYPE, nodePoolPrefab: cc.Node) {
  155. let prefabName = NODEPOOLPREFABTYPE[poolPrefabType];
  156. let nodePool: cc.NodePool = this.nodePoolDic[prefabName];
  157. nodePool.put(nodePoolPrefab);
  158. }
  159. }
  160. /**对象池预制体的枚举值(对应枚举名数组) */
  161. export enum NODEPOOLPREFABTYPE {
  162. /**金币 */
  163. CellItem = 0,
  164. /**选择CellItem按钮 */
  165. SelectCellItemBtn = 1,
  166. /**爆炸 */
  167. Baozha = 2,
  168. /**方块背景 */
  169. CellBg = 3,
  170. /**消除得分 */
  171. EliminateScore = 4,
  172. /**Bonus提示 */
  173. BonusTip = 5,
  174. /**得分能量 */
  175. ScoreEnergy = 6,
  176. /**锤子特效 */
  177. Hammer = 7,
  178. /**变化特效 */
  179. Change = 8,
  180. /**提示item */
  181. TipItemUI = 10,
  182. /**目标达成 */
  183. GetTargetScoreTip = 11,
  184. /**得分 */
  185. GetScore = 13,
  186. /**图片提示item */
  187. TipSpriteItemUI = 14,
  188. }