音乐,音效管理

205 阅读2分钟

/**作者说明

  • author: haoyu

  • time: 2021-08-17

  • func: 音乐,音效管理,ccc2.4.6测试 */

    let AudioManager = { init: function(){ this._playMusic = {}; // 缓存音乐,{name: ID} this._playEffect = {}; // 缓存音效,{name: ID} this._switchMusic = false; // 音乐开关 this._switchEffect = false; // 音效开关 this._effectVolume = 1; // 音效音量 this._musicVolume = 1; // 音乐音量

     // 获取本地设置音量大小
     let audioSetting   = JSON.parse(cc.sys.localStorage.getItem("audio"));
     if(!audioSetting){
         audioSetting = {
             effect:1,music:1
         };
     }
     this._effectVolume = audioSetting["effect"] || 1;
     this._musicVolume  = audioSetting["music"] || 1;
     
     //获取本地开关设置
     let switchSetting = JSON.parse(cc.sys.localStorage.getItem("audioSwitch"));
     if(!switchSetting){
         switchSetting = {
             switchMusic:true,switchEffect:true
         };
     }
     this.initSwitch(switchSetting["switchMusic"], switchSetting["switchEffect"]);
     cc.log('音频管理器初始化-----完成-------');
    

    },

    /**

    • 初始化音乐,音效开关 */

    initSwitch: function(switchMusic, switchEffect){ this._switchEffect = switchEffect || true; this._switchMusic = switchMusic || true; },

    /**

    • 加载文件夹下所有音频资源,默认只加载resources/audio文件夹下的资源
    • //url: 资源所在文件夹 */ reLoadRes: function(){ //cc.loader.loadResDir(url, cc.AudioClip,function(err, res){3 cc.resources.loadDir("audio/", cc.AudioClip,function(err, res){ if(err) { cc.error("加载文件夹下所有音频资源,【音频】资源加载错误"); return ; } }); },

    /**

    • 播放音效文件
    • effectName: 音效文件名称
    • loop: 是否循环播放 */ playEffect: function(effectName, loop = false){ if(this._switchEffect){ cc.resources.load("audio/"+effectName,cc.AudioClip,(err,audio)=>{ if(err){ cc.log(播放音效文件,【音频】音效:${"audio/"+effectName}文件不存在,err=,err); return; } let effectId = cc.audioEngine.playEffect(audio, loop, this._musicVolume); if(!this._playEffect[effectName] && this._playEffect[effectName] !== 0){ this._playEffect[effectName] = effectId; } }); } },

    /**

    • 转换音效开关 */ switchEffectFunc: function(){ this._switchEffect = !this._switchEffect; if(!this._switchEffect){ this.setStopAllEffect(); } cc.sys.localStorage.setItem("audioSwitch", Json.stringify({switchEffect: this._switchEffect, switchMusic: this._switchMusic})); },

    /**

    • 获取音效开关状态 */ getSwitchEffect: function(){ return this._switchEffect; },

    /**

    • 设置音效声音大小
    • value: 0.0 - 1.0 */ setEffectVolume: function(value){ this._effectVolume = value; cc.audioEngine.setEffectsVolume(value); cc.sys.localStorage.setItem("audio", JSON.stringify({effect: this._effectVolume, music: this._musicVolume})); },

    /**

    • 获取音效大小
    • @return 0.0 - 1.0 */ getEffectVolume: function(){ return cc.audioEngine.getEffectsVolume(); },

    /**

    • 暂停指定音效
    • url: 资源路径 */ setPauseEffect: function(effectName){ let audio = this._playEffect[effectName]; if(audio >= 0){ cc.audioEngine.pauseEffect(audio); }else{ cc.error("暂停指定音效,【音频】音效文件:" + effectName + "不存在"); } //cc.log('this._playEffect::',this._playEffect); },

    /**

    • 暂停正在播放的所有音效 */ setPauseAllEffect: function(){ cc.audioEngine.pauseAllEffects(); },

    /**

    • 恢复指定音效
    • effectName: 音效文件名称 */ setResumeEffect: function(effectName){ let audio = this._playEffect[effectName]; if(audio >= 0){ cc.audioEngine.resumeEffect(audio); }else{ cc.error("恢复指定音效,【音频】音效文件" + effectName + "不存在"); } },

    /**

    • 恢复当前说暂停的所有音效 */ setResumeAllEffect: function(){ cc.audioEngine.resumeAllEffects(); },

    /**

    • 停止播放指定音效
    • effectName: 音效文件名称 */ setStopEffect: function(effectName){ let audio = this._playEffect[effectName]; if(audio >= 0){ cc.audioEngine.stopEffect(audio); }else{ cc.error("停止播放指定音效,【音频】音效文件" + effectName + "不存在"); } },

    /**

    • 停止播放所有正在播放的音效 */ setStopAllEffect: function(){ cc.audioEngine.stopAllEffects(); },

    /**

    • 背景音乐播放
    • musicName: 音乐名称
    • loop: 是否循环 */ playMusic : function(musicName, loop = false){ if(this._switchMusic){ cc.resources.load("audio/"+musicName,cc.AudioClip,(err,audio)=>{ if(err){ cc.log(载入音乐:${"audio/"+musicName},err=,err); return; } cc.audioEngine.playMusic(audio, loop); }); } },

    /**

    • 转换音乐按钮开关 */ switchMusicFunc: function(){ this._switchMusic = !this._switchMusic; if(!this._switchMusic){ this.setStopMusic(); } cc.sys.localStorage.setItem("audioSwitch", Json.stringify({switchEffect: this._switchEffect, switchMusic: this._switchMusic})); },

    /**

    • 获取音乐开关状态 */ getSwitchMusic: function(){ return this._switchMusic; },

    /**

    • 暂停当前播放音乐 */ setPauseMusic: function(){ cc.audioEngine.pauseMusic(); },

    /**

    • 恢复当前被暂停音乐音乐 */ setResumeMusic: function(){ cc.audioEngine.resumeMusic(); },

    /**

    • 重新播放该背景音乐 */ replayMusic: function(){ this.setStopMusic(); this.playMusic('bgm'); },

    /**

    • 停止播放音乐
    • releaseData: 控制是否释放音乐资源 true释放资源 | false不释放资源 */ setStopMusic: function(releaseData = true){ cc.audioEngine.stopMusic(releaseData); },

    setMusicVolume: function(value){ this._musicVolume = value; cc.audioEngine.setMusicVolume(value); cc.sys.localStorage.setItem("audio", JSON.stringify({effect: this._effectVolume, music: this._musicVolume})); },

    getMusicVolume: function(){ return cc.audioEngine.getMusicVolume(); },

    /**

    • 音乐是否正在播放(验证些方法来实现背景音乐是否播放完成)
    • return boolen */ isMusicPlaying : function(){ return cc.audioEngine.isMusicPlaying(); },

    /**

    • 释放指定音效资源
    • effectName: 音效文件名称 */ releaseAudio: function(effectName){ let effect = this._playEffect['resources/audio/'+effectName]; if(effect){ cc.audioEngine.uncache(effectName); }else{ cc.error("释放指定音效资源,【音频】资源" + url + "不存在, 释放失败"); }

    },

    releaseAllAudio: function(){ cc.audioEngine.uncacheAll(); },

}

//game.AudioManager = module.exports = AudioManager; //module.exports = AudioManager; window.AudioManager = AudioManager;

`/*使用方式: onMusicClick(e,d){ if(d == 'playMusic'){ AudioManager.playMusic('bgm'); } else if (d == 'setPauseMusic') { AudioManager.setPauseMusic(); } else if (d == 'setResumeMusic') { AudioManager.setResumeMusic(); } else if (d == 'replayMusic') { AudioManager.replayMusic(); } else if (d == 'setStopMusic') { AudioManager.setStopMusic(); } else if (d == 'setMusicVolume') { if(this.Volume){ this.Volume -= 0.3; }else{ this.Volume = 0.8; } cc.log('音量为:',this.Volume); AudioManager.setMusicVolume(this.Volume); }else if(d == 'getMusicVolume'){ cc.log('当前音量为:',AudioManager.getMusicVolume()); }else if(d == 'isMusicPlaying'){ cc.log('当前音乐状态:',AudioManager.isMusicPlaying()); } else if(d == 'playEffect'){ let r = Math.random(); if(r > 0.5){ AudioManager.playEffect('click'); }else{ AudioManager.playEffect('gold'); }

    } else if (d == 'setPauseEffect') {
        AudioManager.setPauseEffect('gold');
    } else if (d == 'setResumeEffect') {
        AudioManager.setResumeEffect('click');
    } else if (d == 'setResumeAllEffect') {
        AudioManager.setResumeAllEffect();
    } else if (d == 'setStopEffect') {
        AudioManager.setStopEffect('click');
    } else if (d == 'setEffectVolume') {
        if(this.EffectVolume){
            this.EffectVolume -= 0.3;
        }else{
            this.EffectVolume = 0.8;
        }
        cc.log('音效音量为:',this.EffectVolume);
        AudioManager.setEffectVolume(this.EffectVolume);
    }else if(d == 'getEffectVolume'){
        cc.log('当前音效音量为:',AudioManager.getEffectVolume());
    }else if(d == 'setStopAllEffect'){
        cc.log('停止所有音效状态:',AudioManager.setStopAllEffect());
    }
}

*/`