| 
									
										
										
										
											2024-12-11 15:08:57 +08:00
										 |  |  | /* | 
					
						
							|  |  |  | 文件名:AudioClass.nut | 
					
						
							|  |  |  | 路径:Core/BaseClass/AudioClass.nut | 
					
						
							|  |  |  | 创建日期:2024-05-30	20:48 | 
					
						
							|  |  |  | 文件用途:音频类 | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | if (!(getroottable().rawin("_Globa_Audio_Volume_"))) _Globa_Audio_Volume_ <- 1.0; | 
					
						
							| 
									
										
										
										
											2024-12-19 23:54:15 +08:00
										 |  |  | if (!(getroottable().rawin("_Globa_Sound_Volume_"))) _Globa_Sound_Volume_ <- 1.0; | 
					
						
							|  |  |  | class Audio extends CL_BaseObject { | 
					
						
							| 
									
										
										
										
											2024-12-11 15:08:57 +08:00
										 |  |  |     //名称 | 
					
						
							|  |  |  |     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) { | 
					
						
							| 
									
										
										
										
											2024-12-19 23:54:15 +08:00
										 |  |  |     return Sound_PlayEffect(Name.tolower(), _Globa_Sound_Volume_); | 
					
						
							| 
									
										
										
										
											2024-12-11 15:08:57 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //全局音效逻辑 | 
					
						
							|  |  |  | function _Yosin_Sound_Logic_(Dt, Stage) { | 
					
						
							|  |  |  |     _Global_AudioControl_.OnUpdate(Dt, Stage); | 
					
						
							|  |  |  | } |