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);
 | |
| } |