184 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
			
		
		
	
	
			184 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
/*
 | 
						|
文件名:AudioClass.nut
 | 
						|
路径:Core/BaseClass/AudioClass.nut
 | 
						|
创建日期:2024-05-30	20:48
 | 
						|
文件用途:音频类
 | 
						|
*/
 | 
						|
if (!(getroottable().rawin("_Globa_Audio_Volume_"))) _Globa_Audio_Volume_ <- 1.0;
 | 
						|
if (!(getroottable().rawin("_Globa_Sound_Volume_"))) _Globa_Sound_Volume_ <- 1.0;
 | 
						|
class Audio extends CL_BaseObject {
 | 
						|
    //名称
 | 
						|
    Name = null;
 | 
						|
    //路径
 | 
						|
    Path = null;
 | 
						|
    //使用时间
 | 
						|
    UseTime = null;
 | 
						|
    //创建时间
 | 
						|
    CreateTime = null;
 | 
						|
 | 
						|
    constructor(gName) {
 | 
						|
        Path = gName;
 | 
						|
        local C_Object = Sound_CreateSound(Path);
 | 
						|
        base.constructor(C_Object);
 | 
						|
 | 
						|
        CreateTime = clock();
 | 
						|
        SetVolume(1.0);
 | 
						|
    }
 | 
						|
 | 
						|
    //播放
 | 
						|
    function Play() {
 | 
						|
        Sound_Play(C_Object);
 | 
						|
        UseTime = clock();
 | 
						|
    }
 | 
						|
    //暂停
 | 
						|
    function Pause() {
 | 
						|
        Sound_Pause(C_Object);
 | 
						|
    }
 | 
						|
    //继续
 | 
						|
    function Resume() {
 | 
						|
        Sound_Resume(C_Object);
 | 
						|
    }
 | 
						|
    //关闭并销毁
 | 
						|
    function Close() {
 | 
						|
        Sound_Close(C_Object);
 | 
						|
    }
 | 
						|
    //获取音量
 | 
						|
    function GetVolume() {
 | 
						|
        return Sound_GetVolume(C_Object);
 | 
						|
    }
 | 
						|
    //设置音量
 | 
						|
    function SetVolume(value) {
 | 
						|
        Sound_SetVolume(C_Object, value * _Globa_Audio_Volume_);
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
    function IsPlaying() {
 | 
						|
        return Sound_IsPlaying(C_Object);
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
class AudioControlClass {
 | 
						|
 | 
						|
    //当前播放音乐集合
 | 
						|
    CurrentMusicList = null;
 | 
						|
    //音源库
 | 
						|
    MusicList = null;
 | 
						|
 | 
						|
    //销毁音乐的时间Flag
 | 
						|
    CloseMusicTimeFlag = 0;
 | 
						|
    //销毁音乐的间隔时间  //5秒一次
 | 
						|
    CloseMusicTime = 5000;
 | 
						|
 | 
						|
    //待移除音乐
 | 
						|
    RemoveMusicQueue = null;
 | 
						|
 | 
						|
    constructor() {
 | 
						|
        CurrentMusicList = {};
 | 
						|
        MusicList = {};
 | 
						|
        RemoveMusicQueue = [];
 | 
						|
 | 
						|
 | 
						|
    }
 | 
						|
 | 
						|
    //预加载音乐
 | 
						|
    function PreLoad(Name) {
 | 
						|
        local Ret = Sound(Name);
 | 
						|
        MusicList[Name] <- Ret;
 | 
						|
    }
 | 
						|
    //加载音乐  加载完成会自动播放
 | 
						|
    function Load(Name) {
 | 
						|
        if (MusicList.rawin(Name)) {
 | 
						|
            CurrentMusicList[Name] <- MusicList[Name];
 | 
						|
            MusicList[Name].Play();
 | 
						|
        } else {
 | 
						|
            local Ret = Sound(Name);
 | 
						|
            Ret.Play();
 | 
						|
            CurrentMusicList[Name] <- Ret;
 | 
						|
            MusicList[Name] <- Ret;
 | 
						|
        }
 | 
						|
        return CurrentMusicList[Name];
 | 
						|
    }
 | 
						|
 | 
						|
    //移除音乐
 | 
						|
    function Remove(Name) {
 | 
						|
        CurrentMusicList[Name].Pause();
 | 
						|
        delete CurrentMusicList[Name];
 | 
						|
    }
 | 
						|
 | 
						|
    //淡出移除音乐 不传值默认倍率  传值设定倍率
 | 
						|
    function RemoveByFadeout(Name, ...) {
 | 
						|
        local realrate = 1.0;
 | 
						|
        if (vargv.len() > 0) realrate = vargv[0];
 | 
						|
        RemoveMusicQueue.append({
 | 
						|
            sound = CurrentMusicList[Name],
 | 
						|
            rate = realrate
 | 
						|
        });
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
    function RemoveMusic(dt) {
 | 
						|
        for (local i = 0; i< RemoveMusicQueue.len(); i++) {
 | 
						|
            local Object = RemoveMusicQueue[i];
 | 
						|
            local SoundObj = Object.sound;
 | 
						|
            local Rate = Object.rate;
 | 
						|
            local SoCurV = SoundObj.GetVolume();
 | 
						|
            //音量降到最低了  停止播放
 | 
						|
            if (SoCurV == 0) {
 | 
						|
                SoundObj.Pause();
 | 
						|
                delete CurrentMusicList[SoundObj.Name];
 | 
						|
                RemoveMusicQueue.remove(i);
 | 
						|
            }
 | 
						|
            //渐变设置音量
 | 
						|
            else {
 | 
						|
                local SetValue = SoCurV - (dt * Rate * 0.0005);
 | 
						|
                if (SetValue< 0) SetValue = 0;
 | 
						|
                SoundObj.SetVolume(SetValue);
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    function OnUpdate(dt, Stage) {
 | 
						|
 | 
						|
        //移除音乐(淡出)
 | 
						|
        RemoveMusic(dt);
 | 
						|
 | 
						|
        //销毁音乐
 | 
						|
        CloseMusic(dt);
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
    function CloseMusic(dt) {
 | 
						|
        CloseMusicTimeFlag += dt;
 | 
						|
        if (CloseMusicTimeFlag >= CloseMusicTime) {
 | 
						|
            local CurrT = clock();
 | 
						|
            //遍历 如果正在播放刷新时间
 | 
						|
            foreach(SoundObj in MusicList) {
 | 
						|
                if (SoundObj.IsPlaying()) SoundObj.UseTime = CurrT;
 | 
						|
            }
 | 
						|
            //遍历判断使用时间距离现在已经超过了500秒就销毁
 | 
						|
            local Arr = [];
 | 
						|
            foreach(SoundObj in MusicList) {
 | 
						|
                if (SoundObj.UseTime && (clock() - SoundObj.UseTime) > 500000) {
 | 
						|
                    Arr.append(SoundObj.Name);
 | 
						|
                }
 | 
						|
            }
 | 
						|
            foreach(Name in Arr) {
 | 
						|
                if (CurrentMusicList.rawin(Name)) CurrentMusicList.rawdelete(Name);
 | 
						|
                if (MusicList.rawin(Name)) MusicList.rawdelete(Name);
 | 
						|
            }
 | 
						|
            CloseMusicTimeFlag = 0;
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 | 
						|
if (!(getroottable().rawin("AudioControl"))) _Global_AudioControl_ <- AudioControlClass();
 | 
						|
 | 
						|
 | 
						|
//播放临时音效
 | 
						|
function Sq_PlaySoundEffect(Name) {
 | 
						|
    return Sound_PlayEffect(Name.tolower(), _Globa_Sound_Volume_);
 | 
						|
}
 | 
						|
 | 
						|
//全局音效逻辑
 | 
						|
function _Yosin_Sound_Logic_(Dt, Stage) {
 | 
						|
    _Global_AudioControl_.OnUpdate(Dt, Stage);
 | 
						|
} |