代码改变世界

Cocos Creator 对象池cc.NodePool的使用

2018-01-14 20:25  罗任德  阅读(8057)  评论(0编辑  收藏  举报

对象池cc.NodePool
把层级管理器中的节点拖进资源管理器中就创建了预制体;
let和var 一样,是声明变量的关键词, 同一个变量名时,var 即使在{}内也作用全局,let有范围;
(1)将需要数量的节点创建出来,并放进对象池:
//...
properties: {
enemyPrefab: cc.Prefab
},
onLoad: function () {
this.enemyPool = new cc.NodePool();
let initCount = 5;
for (let i = 0; i < initCount; ++i) {
let enemy = cc.instantiate(this.enemyPrefab); // 创建节点
this.enemyPool.put(enemy); // 通过 putInPool 接口放入对象池
}
}

(2)获得对象池中储存的对象了:
// ...
createEnemy: function (parentNode) {
let enemy = null;
if (this.enemyPool.size() > 0) { // 通过 size 接口判断对象池中是否有空闲的对象
enemy = this.enemyPool.get();

else { // 如果没有空闲对象,就用 cc.instantiate 重新创建
enemy = cc.instantiate(this.enemyPrefab);
}
enemy.parent = parentNode; // 将生成的敌人加入节点树
enemy.getComponent('Enemy').init(); //接下来就可以调用 enemy 身上的脚本进行初始化
}

(3)节点退还给对象池,以备之后继续循环利用,:
// ...
onEnemyKilled: function (enemy) {
this.enemyPool.put(enemy); // 将节点放进对象池,这个方法会同时调用节点的 removeFromParent();
}

myPool.clear(); // 调用这个方法就可以清空对象池