PoolSystem.ts 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. /**
  2. * @description 对象池管理类
  3. * @author 邹勇
  4. */
  5. export default class PoolSystem {
  6. constructor() {
  7. console.log("PoolSystem:", new Date().getTime());
  8. }
  9. private poolList: Map<string, cc.NodePool>;
  10. public async init(pools: { url: string, num: number }[]) {
  11. this.poolList = new Map<string, cc.NodePool>();
  12. for (let i = 0; i < pools.length; i++) {
  13. let item = pools[i];
  14. let prefab = await mk.loader.load(item.url, cc.Prefab);
  15. if (!prefab) {
  16. console.log("没有找到该prefab", item.url);
  17. continue;
  18. }
  19. var pool: cc.NodePool = new cc.NodePool();
  20. for (let i = 0; i < item.num; ++i) {
  21. let node = cc.instantiate(prefab);
  22. pool.put(node);
  23. }
  24. let arr = item.url.split("/");
  25. this.poolList.set(arr[arr.length - 1], pool);
  26. }
  27. }
  28. /**
  29. * 获取prefab的node
  30. * @param url
  31. * @returns
  32. */
  33. public async getPrefab(url: string) {
  34. let arr = url.split("/");
  35. let name = arr[arr.length - 1];
  36. var pool = this.poolList.get(name);
  37. let node: cc.Node = null;
  38. if (pool && pool.size() > 0) { // 通过 size 接口判断对象池中是否有空闲的对象
  39. node = pool.get();
  40. } else {
  41. let prefab = await mk.loader.load(url, cc.Prefab);
  42. node = cc.instantiate(prefab);
  43. pool.put(node);
  44. }
  45. return node;
  46. }
  47. /**
  48. * 退回对象池
  49. * @param name prefab名字
  50. * @param node
  51. */
  52. return(name, node: cc.Node) {
  53. let pool = this.poolList[name];
  54. if (pool) {
  55. pool.put(node);
  56. }
  57. }
  58. clearPool(name) {
  59. if (this.poolList[name]) {
  60. this.poolList[name].clear();
  61. }
  62. }
  63. }