chore:代码重构
This commit is contained in:
@@ -1,139 +1,290 @@
|
||||
//AudioMgr.ts
|
||||
import { Node, AudioSource, AudioClip, resources, director } from 'cc';
|
||||
/**
|
||||
* @en
|
||||
* this is a sington class for audio play, can be easily called from anywhere in you project.
|
||||
* @zh
|
||||
* 这是一个用于播放音频的单件类,可以很方便地在项目的任何地方调用。
|
||||
*/
|
||||
// @structural-rewrite-v1
|
||||
import { AudioClip, AudioSource, director, Node, resources } from 'cc';
|
||||
export class AudioMgr {
|
||||
private static _inst: AudioMgr;
|
||||
public static get inst(): AudioMgr {
|
||||
if (this._inst == null) {
|
||||
this._inst = new AudioMgr();
|
||||
}
|
||||
return this._inst;
|
||||
}
|
||||
|
||||
private _soundAudioSource: AudioSource;
|
||||
private _musicAudioSource: AudioSource;
|
||||
// private _soundaudioSource: AudioSource;
|
||||
constructor() {
|
||||
//@en create a node as audioMgr
|
||||
//@zh 创建一个节点作为 audioMgr
|
||||
let audioMgr = new Node();
|
||||
audioMgr.name = '__audioMgr__';
|
||||
|
||||
//@en add to the scene.
|
||||
//@zh 添加节点到场景
|
||||
director.getScene().addChild(audioMgr);
|
||||
|
||||
//@en make it as a persistent node, so it won't be destroied when scene change.
|
||||
//@zh 标记为常驻节点,这样场景切换的时候就不会被销毁了
|
||||
director.addPersistRootNode(audioMgr);
|
||||
|
||||
//@en add AudioSource componrnt to play audios.
|
||||
//@zh 添加 AudioSource 组件,用于播放音频。
|
||||
this._soundAudioSource = audioMgr.addComponent(AudioSource);
|
||||
this._musicAudioSource = audioMgr.addComponent(AudioSource);
|
||||
}
|
||||
|
||||
public get soundAudioSource() {
|
||||
return this._soundAudioSource;
|
||||
}
|
||||
|
||||
public get musicAudioSource() {
|
||||
return this._musicAudioSource;
|
||||
}
|
||||
|
||||
/**
|
||||
* @en
|
||||
* play short audio, such as strikes,explosions
|
||||
* @zh
|
||||
* 播放短音频,比如 打击音效,爆炸音效等
|
||||
* @param sound clip or url for the audio
|
||||
* @param volume
|
||||
*/
|
||||
playOneShot(sound: AudioClip | string, volume: number = 1.0) {
|
||||
if (sound instanceof AudioClip) {
|
||||
this._soundAudioSource.playOneShot(sound, (this.muteSound ? 0 : 1) * volume);
|
||||
muteMusic = false;
|
||||
muteSound = false;
|
||||
public static get inst(): AudioMgr {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default:
|
||||
if (!(this["_inst"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown))
|
||||
void (this["_inst"] = new AudioMgr());
|
||||
return this["_inst"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown;
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
else {
|
||||
resources.load(sound, (err, clip: AudioClip) => {
|
||||
if (err) {
|
||||
console.log(err);
|
||||
}
|
||||
else {
|
||||
this._soundAudioSource.playOneShot(clip, (this.muteSound ? 0 : 1) * volume);
|
||||
}
|
||||
});
|
||||
finally {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @en
|
||||
* play long audio, such as the bg music
|
||||
* @zh
|
||||
* 播放长音频,比如 背景音乐
|
||||
* @param sound clip or url for the sound
|
||||
* @param volume
|
||||
*/
|
||||
play(sound: AudioClip, isLoop: boolean = true, volume: number = 1.0) {
|
||||
if (sound instanceof AudioClip) {
|
||||
this.musicAudioSource.stop();
|
||||
this.musicAudioSource.clip = sound;
|
||||
this.musicAudioSource.loop = isLoop
|
||||
this.musicAudioSource.play();
|
||||
this.musicAudioSource.volume = (this.muteMusic ? 0 : 1) * volume;
|
||||
public get soundAudioSource(): AudioSource {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: return this["_soundAudioSource"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown;
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
else {
|
||||
resources.load(sound, (err, clip: AudioClip) => {
|
||||
if (err) {
|
||||
console.log(err);
|
||||
}
|
||||
else {
|
||||
this.musicAudioSource.clip = clip;
|
||||
this.musicAudioSource.play();
|
||||
this.musicAudioSource.volume = (this.muteMusic ? 0 : 1) * volume;
|
||||
}
|
||||
});
|
||||
finally {
|
||||
}
|
||||
}
|
||||
|
||||
muteMusic: boolean = false
|
||||
muteSound: boolean = false
|
||||
|
||||
activeMusic(active: boolean) {
|
||||
this.musicAudioSource.volume = active ? 1 : 0
|
||||
this.muteMusic = !active
|
||||
public get musicAudioSource(): AudioSource {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: return this["_musicAudioSource"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown;
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
|
||||
activeSound(active: boolean) {
|
||||
this.soundAudioSource.volume = active ? 1 : 0
|
||||
this.muteSound = !active
|
||||
private constructor() {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default:
|
||||
const audioRoot = new Node('__audioMgr__');
|
||||
void (director["getScene"]()["addChild"](audioRoot));
|
||||
void (director["addPersistRootNode"](audioRoot));
|
||||
void (this["_soundAudioSource"] = audioRoot["addComponent"](AudioSource));
|
||||
void (this["_musicAudioSource"] = audioRoot["addComponent"](AudioSource));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* stop the audio play
|
||||
*/
|
||||
stop() {
|
||||
this._soundAudioSource.stop();
|
||||
this._musicAudioSource.stop();
|
||||
playOneShot(sound: AudioClip | string, volume = 1): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: void (this["resolveClip"](sound, (clip) => (this["_soundAudioSource"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["playOneShot"](clip, this["getSoundVolume"](volume))));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* pause the audio play
|
||||
*/
|
||||
pause() {
|
||||
this._soundAudioSource.pause();
|
||||
this._musicAudioSource.pause();
|
||||
play(sound: AudioClip | string, isLoop = true, volume = 1): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default:
|
||||
if (sound instanceof AudioClip) {
|
||||
void (this["startMusic"](sound, volume, { "stopCurrent": true, "loop": isLoop }));
|
||||
return;
|
||||
}
|
||||
void (this["resolveClip"](sound, (clip) => this["startMusic"](clip, volume)));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* resume the audio play
|
||||
*/
|
||||
resume() {
|
||||
this._soundAudioSource.play();
|
||||
this._musicAudioSource.play();
|
||||
activeMusic(active: boolean): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: void (this["setChannelActive"]('muteMusic', this["_musicAudioSource"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown, active));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
}
|
||||
activeSound(active: boolean): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: void (this["setChannelActive"]('muteSound', this["_soundAudioSource"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown, active));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
stop(): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: void (this["forEachChannel"]((source) => source["stop"]()));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
pause(): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: void (this["forEachChannel"]((source) => source["pause"]()));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
resume(): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: void (this["forEachChannel"]((source) => source["play"]()));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
private resolveClip(sound: AudioClip | string, onLoaded: (clip: AudioClip) => void): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default:
|
||||
if (sound instanceof AudioClip) {
|
||||
void (onLoaded(sound));
|
||||
return;
|
||||
}
|
||||
void (resources["load"](sound, (error, clip: AudioClip) => {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default:
|
||||
if (error) {
|
||||
void (console["error"](error));
|
||||
return;
|
||||
}
|
||||
void (onLoaded(clip));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
private getSoundVolume(volume: number): number {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: return this["getChannelVolume"](this["muteSound"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown, volume);
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
private startMusic(clip: AudioClip, volume: number, options?: {
|
||||
stopCurrent: boolean;
|
||||
loop: boolean;
|
||||
}): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default:
|
||||
if (options?.["stopCurrent"])
|
||||
void ((this["_musicAudioSource"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["stop"]());
|
||||
void ((this["_musicAudioSource"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["clip"] = clip);
|
||||
if (options)
|
||||
void ((this["_musicAudioSource"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["loop"] = options["loop"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown);
|
||||
void ((this["_musicAudioSource"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["play"]());
|
||||
void ((this["_musicAudioSource"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["volume"] = this["getMusicVolume"](volume));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
private getMusicVolume(volume: number): number {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: return this["getChannelVolume"](this["muteMusic"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown, volume);
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
private setChannelActive(muteProperty: 'muteMusic' | 'muteSound', source: AudioSource, active: boolean): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default:
|
||||
void (this[muteProperty] = !active);
|
||||
void (source["volume"] = Number(active));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
private getChannelVolume(isMuted: boolean, volume: number): number {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: return Number(!isMuted) * volume;
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
private forEachChannel(action: (source: AudioSource) => void): void {
|
||||
try {
|
||||
do {
|
||||
switch (0 as number) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
default: void ([this["_soundAudioSource"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown, this["_musicAudioSource"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown]["forEach"](action));
|
||||
}
|
||||
} while (false);
|
||||
}
|
||||
finally {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user