import { AudioClip, resources } from “cc”;
export class BaseClass {
public constructor() { }
public static getSingleton(...param: any[]): any {
let Class: any = this;
if (!Class._instance) {
Class._instance = new Class(...param);
}
return Class._instance;
}
}
export class AudioManager extends BaseClass {
private _audios: any;
public constructor() {
super();
this._audios = {}
}
/**
* 预加载音频
* @param url
*/
public preloadAudioClip(url: string, callback: Function = null) {
resources.load(url, AudioClip, (error: Error, audioClip: AudioClip) => {
if (!error) {
this._audios[url] = audioClip;
callback && callback();
}
})
}
/**
* 播放短音效
* @param url
* @param loop
* @param volume
* @param callback
*/
public playAudioClip(url: string, volume: number = 1.0) {
let playAudio = (audio: AudioClip) => {
audio.play();
audio.setVolume(volume);
audio.on("ended", () => {
audio.stop(); //播放完停止,并释放
resources.release(url, AudioClip);
delete this._audios[url];
})
}
if (this._audios[url]) {
playAudio(this._audios[url]);
} else {
resources.load(url, AudioClip, (error: Error, audioClip: AudioClip) => {
if (!error) {
this._audios[url] = audioClip;
playAudio(audioClip);
}
})
}
}
/**
* 暂停短小的音效
* @param url
*/
public stopAudioClip(url: string) {
let stopAudio = (audio: AudioClip) => {
audio.stop();
resources.release(url, AudioClip);
delete this._audios[url];
}
if (this._audios[url]) {
stopAudio(this._audios[url])
}
}
/**
* 播放背景音乐
* @param url
* @param loop
* @param volume
* @param callback
*/
public playAudio(url: string, loop: boolean, volume: number, callback?: Function) {
let playAudio = (audioClip: AudioClip) => {
audioClip.play();
audioClip.setLoop(loop);
audioClip.setVolume(volume);
}
if (this._audios[url]) {
playAudio(this._audios[url]);
} else {
resources.load(url, AudioClip, (error: Error, audioClip: AudioClip) => {
if (!error) {
this._audios[url] = audioClip;
playAudio(audioClip);
}
})
}
}
/**
* 停止背景音乐
* @param url
* @param isRelase
*/
public stopAudio(url: string, isRelase?: boolean) {
if (this._audios[url]) {
this._audios[url].stop();
resources.release(url, AudioClip);
delete this._audios[url];
}
if (isRelase) {
resources.release(url, AudioClip);
delete this._audios[url];
}
}
}