你可能感兴趣:
在游戏中,背景音乐与音效是一个不可忽视的元素,写一个音效管理类可以帮助我们有效的进行背景音乐和音效的替换、调整声音大小、统一暂停等操作。
同样,在这里将这个音效管理类设为单例模式:
//单例唯一实例
private static _instance:AudioManager = null;
public static get instance():AudioManager{
if(!this._instance){
this._instance = new AudioManager();
}
return this._instance;
}
背景音乐的处理:
其中的EnumManager.instance.AudioPath是一个枚举类型,我将音乐和音效的路径放到其中,方便使用。
//默认bgm
private bgm:string = "";
/**
* 播放或者切换背景音乐
* @param bgm 背景音乐的路径名称,使用EnumManager.instance.AudioPath
* @returns
*/
public playBGM(bgm:string){
if(bgm === "" || this.bgm === bgm || !Manager.DataManager.bIsOpenMusic){
return;
}
this.bgm = bgm;
cc.audioEngine.stopMusic();
let path = bgm;
Manager.ResManager.loadResource(path,cc.AudioClip,(err,res:cc.AudioClip)=>{
if(err){
Logger.err(err);
return;
}
cc.audioEngine.playMusic(res,true);
});
}
/**
* 背景音乐是否正在播放
* @returns 返回true/false
*/
public isPlayingBGM():boolean{
return cc.audioEngine.isMusicPlaying();
}
/**
* 恢复背景音乐
*/
public resumeBGM(){
cc.audioEngine.stopMusic();
if(this.bgm === ""){
this.bgm = EnumManager.instance.AudioPath.bgm;
}
let path = this.bgm;
Manager.ResManager.loadResource(path,cc.AudioClip,(err,res:cc.AudioClip)=>{
if(err){
Logger.err(err);
return;
}
cc.audioEngine.playMusic(res,true);
});
}
//停止播放背景音乐
public stopMusic(){
cc.audioEngine.stopMusic();
}
音效处理:
/**
* 播放音效
* @param soundName 音效路径名称,使用EnumManager.instance.AudioPath
* @param loop 是否循环播放
* @param vulome 音效声音大小
*/
public playSound(soundName:string,loop?:boolean,vulome?:number){
if(soundName ==="" || !Manager.DataManager.bIsOpenSound){
return;
}
let path = soundName;
Manager.ResManager.loadResource(path,cc.AudioClip,(err,res:cc.AudioClip)=>{
if(err){
Logger.err(err);
return;
}
cc.audioEngine.playEffect(res,loop?loop:false);
cc.audioEngine.setEffectsVolume(vulome);
});
}
/**
* 停止播放所有音效
*/
public stopSound(){
cc.audioEngine.stopAllEffects();
}
/**
* 恢复播放所有音效
*/
public resumeSound(){
cc.audioEngine.resumeAllEffects();
}
音乐和音效的共同控制:
/**
* 停止播放背景音乐和音效
*/
public stopAllMusicAndSound(){
cc.audioEngine.stopAll();
}
/**
* 恢复播放背景音乐和音效
*/
public resumeAllMusicAndSound(){
cc.audioEngine.resumeAll();
}
/**
* 设置背景音乐的音量大小(0-1)
*/
public setMusicVolume(volume:number){
cc.audioEngine.setMusicVolume(volume);
}
/**
* 设置音效的音量大小(0-1)
*/
public setSoundVolume(volume:number){
cc.audioEngine.setEffectsVolume(volume);
}
防止按钮连续点击处理:
/**
* 音效按钮有效点击时间
*/
private clickTime:number = 0;
public isCanClick():boolean{
let time = new Date().getTime();
if((time - this.clickTime) < 300){
return;
}
else{
this.clickTime = time;
}
this.playSound(EnumManager.instance.AudioPath.buttonSound);
}
在最后放了一个通用的防止按钮或者点击的图片多次触发的处理。