CocosCreator+TS音效管理类

你可能感兴趣:

cocosceator+TS资源管理类

Cocos Creator+TS改造日志系统

Cocos Creator+TS自己写一个消息机制

在游戏中,背景音乐与音效是一个不可忽视的元素,写一个音效管理类可以帮助我们有效的进行背景音乐和音效的替换、调整声音大小、统一暂停等操作。

同样,在这里将这个音效管理类设为单例模式:

    //单例唯一实例
    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);
    }

在最后放了一个通用的防止按钮或者点击的图片多次触发的处理。

你可能感兴趣的:(Cocos,Creator,cocos-creator,typescript)