221 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
		
		
			
		
	
	
			221 lines
		
	
	
		
			5.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("_SoundEffect_List_"))) _SoundEffect_List_ <- []; | ||
|  | class Sound 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 SoundEffect extends Sound { | ||
|  | 
 | ||
|  |     constructor(Name) { | ||
|  |         base.constructor(Name); | ||
|  | 
 | ||
|  |         //加入全局临时音效组 | ||
|  |         JoinSoundEffect(); | ||
|  |         //默认调用播放 | ||
|  |         Play(); | ||
|  |     } | ||
|  | 
 | ||
|  |     //加入全局临时音效组 | ||
|  |     function JoinSoundEffect() { | ||
|  |         _SoundEffect_List_.append(this); | ||
|  |     } | ||
|  | 
 | ||
|  | } | ||
|  | 
 | ||
|  | class AudioControlClass { | ||
|  | 
 | ||
|  |     //当前播放音乐集合 | ||
|  |     CurrentMusicList = null; | ||
|  |     //音源库 | ||
|  |     MusicList = null; | ||
|  | 
 | ||
|  |     //销毁临时音效的时间Flag | ||
|  |     CloseSoundEffectTimeFlag = 0; | ||
|  |     //销毁临时音效的间隔时间  //5秒一次 | ||
|  |     CloseSoundEffectTime = 5000; | ||
|  |     //销毁音乐的时间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); | ||
|  | 
 | ||
|  |         //销毁临时音效 | ||
|  |         CloseSoundEffect(dt); | ||
|  |         //销毁音乐 | ||
|  |         CloseMusic(dt); | ||
|  |     } | ||
|  | 
 | ||
|  |     function CloseSoundEffect(dt) { | ||
|  |         CloseSoundEffectTimeFlag += dt; | ||
|  |         if (CloseSoundEffectTimeFlag >= CloseSoundEffectTime) { | ||
|  |             for (local i = 0; i< _SoundEffect_List_.len(); i++) { | ||
|  |                 local SoundEffectObj = _SoundEffect_List_[i]; | ||
|  |                 //播放完成销毁资源 | ||
|  |                 if (!SoundEffectObj.IsPlaying()) { | ||
|  |                     _SoundEffect_List_.remove(i); | ||
|  |                 } | ||
|  |             } | ||
|  |             CloseSoundEffectTimeFlag = 0; | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     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 SoundEffect(Name); | ||
|  | } | ||
|  | 
 | ||
|  | //全局音效逻辑 | ||
|  | function _Yosin_Sound_Logic_(Dt, Stage) { | ||
|  |     _Global_AudioControl_.OnUpdate(Dt, Stage); | ||
|  | } |