118 lines
3.6 KiB
TypeScript
118 lines
3.6 KiB
TypeScript
import Node = cc.Node;
|
|
import Animation = cc.Animation;
|
|
import ParticleSystem = cc.ParticleSystem;
|
|
import instantiate = cc.instantiate;
|
|
|
|
export class LQPoolUtil {
|
|
private static any_pool: { [key: string]: Node[] } = {};
|
|
|
|
private static reset_ani(node: Node) {
|
|
let ani = node.getComponent(Animation);
|
|
if (ani) {
|
|
let clip = ani.currentClip ? ani.currentClip : ani.defaultClip;
|
|
if (!clip) {
|
|
return;
|
|
}
|
|
if (ani.playOnLoad && clip && clip.wrapMode === cc.WrapMode.Normal) {
|
|
ani.play(clip.name);
|
|
}
|
|
} else {
|
|
let ani = node.getComponent(sp.Skeleton);
|
|
if (ani && !ani.loop) {
|
|
ani.setAnimation(0, ani.animation, false);
|
|
}
|
|
}
|
|
for (let i = 0; i < node.childrenCount; i++) {
|
|
const child = node.children[i];
|
|
this.reset_ani(child);
|
|
}
|
|
}
|
|
|
|
public static recursion_stop_particle(node: Node, obj: { has: boolean }) {
|
|
const p = node.getComponent(ParticleSystem);
|
|
if (p) {
|
|
p.stopSystem();
|
|
obj.has = true;
|
|
p.node.opacity = 0;
|
|
}
|
|
for (let i = 0; i < node.childrenCount; i++) {
|
|
const child = node.children[i];
|
|
this.recursion_stop_particle(child, obj);
|
|
}
|
|
}
|
|
|
|
public static recursion_reset_particle(node: Node) {
|
|
if (!node.isValid) {
|
|
return;
|
|
}
|
|
const p = node.getComponent(ParticleSystem);
|
|
if (p) {
|
|
p.resetSystem();
|
|
p.node.opacity = 255;
|
|
}
|
|
for (let i = 0; i < node.childrenCount; i++) {
|
|
const child = node.children[i];
|
|
this.recursion_reset_particle(child);
|
|
}
|
|
}
|
|
|
|
public static get_node_from_pool(node_parent: Node, prefab: Node) {
|
|
let arr = this.any_pool[prefab.uuid];
|
|
if (!arr) {
|
|
this.any_pool[prefab.uuid] = [];
|
|
arr = [];
|
|
}
|
|
let node = arr.pop();
|
|
if (!node || !node.isValid) {
|
|
node = instantiate(prefab);
|
|
//@ts-ignore
|
|
node.recovery_uuid = prefab.uuid;
|
|
//@ts-ignore
|
|
node.is_from_pool = false;
|
|
node_parent.addChild(node);
|
|
} else {
|
|
node.active = true;
|
|
//@ts-ignore
|
|
node.is_from_pool = true;
|
|
this.reset_ani(node);
|
|
}
|
|
return node;
|
|
}
|
|
|
|
private static check_pool_push(arr: Node[], node: Node) {
|
|
for (let i = 0; i < arr.length; i++) {
|
|
if (arr[i] === node) {
|
|
//@ts-ignore
|
|
console.warn(`池子不能重复添加节点`, node.name, node.recovery_uuid);
|
|
return;
|
|
}
|
|
}
|
|
node.active = false;
|
|
arr.push(node);
|
|
}
|
|
|
|
public static push_node_to_pool(node: Node) {
|
|
//@ts-ignore
|
|
if (!node.recovery_uuid || !this.any_pool[node.recovery_uuid]) {
|
|
if (node.isValid) {
|
|
node.destroy();
|
|
}
|
|
return;
|
|
}
|
|
const obj: { has: boolean } = {has: false};
|
|
this.recursion_stop_particle(node, obj);
|
|
if (obj.has) {
|
|
let old_opacity = node.opacity;
|
|
node.opacity = 0;
|
|
setTimeout(() => {
|
|
this.recursion_reset_particle(node);
|
|
node.opacity = old_opacity;
|
|
//@ts-ignore
|
|
this.check_pool_push(this.any_pool[node.recovery_uuid], node);
|
|
}, 500);
|
|
} else {
|
|
//@ts-ignore
|
|
this.check_pool_push(this.any_pool[node.recovery_uuid], node);
|
|
}
|
|
}
|
|
} |