| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214 |
- const { ccclass } = cc._decorator;
- @ccclass
- export default class PoolMgr {
- //单例模式---------------------------
- private static instance: PoolMgr = null;
- public static get Inst(): PoolMgr {
- if (!PoolMgr.instance) {
- PoolMgr.instance = new PoolMgr();
- }
- return PoolMgr.instance;
- }
- /**对象池预支体目录 */
- private nodePoolDir: string = "game/prefab/nodepool/"
- private className: string = "";
- /**
- * 对象池预制体字典
- * @param key:string 预制体名字
- * @param valuee:cc.Prefab 预制体
- */
- public prefabDic: { [key: string]: cc.Prefab } = {};
- /**
- * 对象池字典
- * @param key:string 预制体名字
- * @param valuee:cc.NodePool 对应的对象池
- */
- public nodePoolDic: { [key: string]: cc.NodePool } = {};
- // LIFE-CYCLE CALLBACKS:
- onLoad() {
- }
- start() {
- }
- /**初始化对象池的预制体 */
- initPoolPrefab() {
- let self = this;
- //FC:获取当前类名
- self.className = self["__proto__"]["constructor"].name;
-
- //LogUtil.log("Object.keys(POOLPREFABTYPE)", Object.keys(NODEPOOLPREFABTYPE));
- // LogUtil.log("POOLPREFABTYPE[key]", typeof (POOLPREFABTYPE[POOLPREFABTYPE.Dart]));
- for (var i = 0; i < Object.keys(NODEPOOLPREFABTYPE).length; i++) {
- let key = Object.keys(NODEPOOLPREFABTYPE)[i];
- let value = NODEPOOLPREFABTYPE[key];
- //LogUtil.log("key", key)
- //FC:注释
- // if (Number(key) || Number(key) == 0) {
- // //LogUtil.log("key", key);
- // // LogUtil.log("value", value);
- // //初始化对象池
- // if (!self.nodePoolDic[value]) {
- // self.nodePoolDic[value] = new cc.NodePool();
- // }
- // LogUtil.log("加载预制体啦啦啦啦啦啦啦啦啦啦啦啦")
- // //加载预制体
- // cc.loader.loadRes(`${this.nodePoolDir}${value}`, function (err, prefab: cc.Prefab) {
- // if (err) {
- // LogUtil.log(`[${self.className}]加载预制体失败:${value}`, err);
- // }
- // else {
- // LogUtil.log(`[${self.className}]加载预制体成功:${value}`,prefab);
- // //初始化预制体
- // self.prefabDic[value] = prefab;
- // //实例化预制体
- // let nodePoolPrefab = cc.instantiate(prefab);
- // self.nodePoolDic[value].put(nodePoolPrefab);
- // }
- // }.bind(this));
- // }
- // else {
- // continue;
- // }
- //FC:应对遍历不到数字型Key值问题
- if (Number(key) || Number(key) == 0) {
- continue;
- }
- else {
- //LogUtil.log("[PoolMgr] key", key);
- // LogUtil.log("value", value);
- //初始化对象池
- if (!self.nodePoolDic[key]) {
- self.nodePoolDic[key] = new cc.NodePool();
- }
- //LogUtil.log("加载预制体啦啦啦啦啦啦啦啦啦啦啦啦")
- //加载预制体
- cc.loader.loadRes(`${this.nodePoolDir}${key}`, function (err, prefab: cc.Prefab) {
- if (err) {
- mk.console.log(`[${self.className}]加载预制体失败:${key}`, err);
- }
- else {
- //LogUtil.log(`[${self.className}]加载预制体成功:${key}`, prefab);
- //初始化预制体
- self.prefabDic[key] = prefab;
- //实例化预制体
- let nodePoolPrefab = cc.instantiate(prefab);
- self.nodePoolDic[key].put(nodePoolPrefab);
- }
- }.bind(this));
- }
- }
- //也可以遍历
- // for (var e in POOLPREFABTYPE) {
- // LogUtil.log("e String", String(e));
- // LogUtil.log("e Number", Number(e));
- // }
- }
- /**初始化预制体根据数目(有些可能需要初始生成大量的预制体)
- * @param poolPrefabType 对象池预制体的类型
- * @param initNum 需要的数量
- */
- initPoolPrefabByNum(poolPrefabType: NODEPOOLPREFABTYPE, initNum: number) {
- let prefabName = NODEPOOLPREFABTYPE[poolPrefabType];
- let prefab = this.prefabDic[prefabName];
- //可能有些一开始要生成大量的预制体
- for (let i = 0; i < initNum; ++i) {
- let nodePoolPrefab = cc.instantiate(prefab); // 创建节点
- this.nodePoolDic[prefabName].put(nodePoolPrefab); // 通过 put 接口放入对象池
- }
- }
- /**获取对象池的预制体
- * @param poolPrefabType 对象池预制体的类型
- */
- getPoolPrefab(poolPrefabType: NODEPOOLPREFABTYPE) {
- let prefabName = NODEPOOLPREFABTYPE[poolPrefabType];
- let nodePoolPrefab: cc.Node = null;
- let prefab: cc.Prefab = this.prefabDic[prefabName];
- //如果有加载好的预制体
- if (prefab) {
- let nodePool: cc.NodePool = this.nodePoolDic[prefabName];
- if (nodePool.size() > 0) { // 通过 size 接口判断对象池中是否有空闲的对象
- nodePoolPrefab = nodePool.get();
- } else { // 如果没有空闲对象,也就是对象池中备用对象不够时,我们就用 cc.instantiate 重新创建
- nodePoolPrefab = cc.instantiate(prefab);
- }
- //LogUtil.log("hairPrefab",hairPrefab);
- return nodePoolPrefab;
- }
- else {
- let value = NODEPOOLPREFABTYPE[poolPrefabType];
- mk.console.log("poolPrefabType", poolPrefabType, value);
- cc.loader.loadRes(`${this.nodePoolDir}${value}`, function (err, prefab: cc.Prefab) {
- if (err) {
- mk.console.log("加载预制体失败level", err);
- }
- else {
- nodePoolPrefab = cc.instantiate(prefab);
- mk.console.log(" nodePoolPrefab ", nodePoolPrefab);
- return nodePoolPrefab;
- }
- }.bind(this));
- }
- }
- /**回收对象池的预制体
- * @param poolPrefabType 对象池预制体的类型
- * @param nodePoolPrefab 预制体对象
- */
- recyclePoolPrefab(poolPrefabType: NODEPOOLPREFABTYPE, nodePoolPrefab: cc.Node) {
- let prefabName = NODEPOOLPREFABTYPE[poolPrefabType];
- let nodePool: cc.NodePool = this.nodePoolDic[prefabName];
- nodePool.put(nodePoolPrefab);
- }
- }
- /**对象池预制体的枚举值(对应枚举名数组) */
- export enum NODEPOOLPREFABTYPE {
- /**金币 */
- CellItem = 0,
- /**选择CellItem按钮 */
- SelectCellItemBtn = 1,
- /**爆炸 */
- Baozha = 2,
- /**方块背景 */
- CellBg = 3,
- /**消除得分 */
- EliminateScore = 4,
- /**Bonus提示 */
- BonusTip = 5,
- /**得分能量 */
- ScoreEnergy = 6,
- /**锤子特效 */
- Hammer = 7,
- /**变化特效 */
- Change = 8,
- /**提示item */
- TipItemUI = 10,
- /**目标达成 */
- GetTargetScoreTip = 11,
- /**得分 */
- GetScore = 13,
- /**图片提示item */
- TipSpriteItemUI = 14,
- }
|