123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- 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);
- }
- }
- }
|