1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
| /**
* 对象池名,
* 值为 对应的类名, pool 会调用相应类下的 unuse,reuse 方法
*/
export default class Pool {
constructor() {}
private static __p = {}
/**
* 获取对象池 对象
* @param name 对象池对应的名称, 如果使用类为为 name 则会调用相应类下的 unuse,reuse
* @param key 这个对象的区分 key (比如 name 使用球类对象, key 可以用来区分 足球,篮球等)
* @returns
*/
private static getPool(name: string, key?: string): cc.NodePool {
if (!key) {
if (!this.__p[name]) this.__p[name] = new cc.NodePool(name.toString())
return this.__p[name]
} else {
if (!this.__p[name]) this.__p[name] = {}
if (!this.__p[name][key]) this.__p[name][key] = new cc.NodePool(name.toString())
return this.__p[name][key]
}
}
/**
* 获取节点
* @param name
* @param key
* @returns
*/
public static getNode(prefab: cc.Prefab, name: string, key?: string, ...reseuOp: any): cc.Node {
const p = this.getPool(name, key)
if (p.size() > 0) return p.get(...reseuOp)
const _node = cc.instantiate(prefab)
p.put(_node)
return p.get(...reseuOp)
}
/**
* 回收对象节点
*/
public static recycleNode(node: cc.Node, name: string, key?: string) {
const p = this.getPool(name, key)
p.put(node)
}
/**
* 清空所有的对象
*/
public static clearAll() {
for (let i in this.__p) {
this.clearPool(i)
}
}
/**
* 清空对象池
* 如果只传name,会判断name下是否有key,一并清空
* 如果传了key,则只会清空 name[key] 下的数据
* @param name
* @param key
*/
public static clearPool(name: string, key?: string) {
const p = this.__p[name]
if (key === undefined) {
if (p.clear) p.clear()
else {
for (let i in p) {
p[i].clear()
}
}
} else {
p[key] && p[key].clear()
}
}
}
|