creator3.0引擎背景音乐和音效动态播放

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];

    }

}

}

2赞

可以加个 private bmg_playing: boolean = false; //背景音乐是否正在播放限制一下