/* 文件名: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); }