pinball/assets/_Game/Scripts/GameDirector.ts

127 lines
3.9 KiB
TypeScript
Raw Normal View History

2024-04-17 01:47:13 -07:00
import {
Node,
AnimationState,
director,
TweenSystem,
PhysicsSystem2D,
PhysicsSystem,
AnimationManager,
Animation,
} from 'cc';
export class pauseConfig {
exclude?: Node[];
recuExclude?: Node[];
}
export default class GameDirector {
public static pauseData = new (class {
state = false;
physics2D: boolean;
physics3D: boolean;
scheduler: any[];
anim: AnimationState[] = [];
tweenTarget: any[];
})();
private static recuNodeList(node: Node, result: Node[] = []): Node[] {
if (!node) {
return result;
}
result.push(node);
node.children.forEach((v1) => {
result.push(v1);
this.recuNodeList(v1);
});
return result;
}
public static pause(config?: pauseConfig): void {
if (GameDirector.pauseData.state) {
return;
}
GameDirector.pauseData.scheduler = director.getScheduler().pauseAllTargets();
let animSystem = director.getSystem(AnimationManager.ID);
GameDirector.pauseData.anim.splice(0, GameDirector.pauseData.anim.length, ...animSystem['_anims'].array);
GameDirector.pauseData.anim.forEach((v1) => {
v1.pause();
});
GameDirector.pauseData.tweenTarget = TweenSystem.instance.ActionManager.pauseAllRunningActions();
{
if (PhysicsSystem2D && PhysicsSystem2D.instance.enable) {
GameDirector.pauseData.physics2D = PhysicsSystem2D.instance.enable;
PhysicsSystem2D.instance.enable = false;
}
if (PhysicsSystem && PhysicsSystem.instance.enable) {
GameDirector.pauseData.physics3D = PhysicsSystem.instance.enable;
PhysicsSystem.instance.enable = false;
}
}
if (config) {
let exclude: Node[] = [];
exclude.push(...config.exclude);
config.recuExclude?.forEach((v1) => {
exclude.push(...GameDirector.recuNodeList(v1));
});
exclude.forEach((v1) => {
GameDirector.resumeNode(v1);
});
}
GameDirector.pauseData.state = true;
}
public static resume(): void {
director.getScheduler().resumeTargets(GameDirector.pauseData.scheduler);
GameDirector.pauseData.anim.forEach((v1) => {
if (v1.isPlaying && v1.isPaused) {
v1.play();
}
});
TweenSystem.instance.ActionManager.resumeTargets(GameDirector.pauseData.tweenTarget);
if (GameDirector.pauseData.physics2D) {
PhysicsSystem2D.instance.enable = GameDirector.pauseData.physics2D;
}
if (GameDirector.pauseData.physics3D) {
PhysicsSystem.instance.enable = GameDirector.pauseData.physics3D;
}
GameDirector.pauseData.state = false;
}
public static pauseNode(node: Node): void;
public static pauseNode(node: Node[]): void;
public static pauseNode(args: Node | Node[]): void {
let node: Node[];
if (Array.isArray(args)) {
node = args;
} else {
node = [args];
}
node.forEach((v1) => {
director.getScheduler().pauseTarget(v1);
v1.getComponent(Animation)?.pause();
TweenSystem.instance.ActionManager.pauseTarget(v1);
});
}
public static resumeNode(node: Node): void;
public static resumeNode(node: Node[]): void;
public static resumeNode(args: Node | Node[]): void {
let node: Node[];
if (Array.isArray(args)) {
node = args;
} else {
node = [args];
}
node.forEach((v1) => {
director.getScheduler().resumeTarget(v1);
v1.getComponent(Animation)?.resume();
TweenSystem.instance.ActionManager.resumeTarget(v1);
});
}
}