From 06d54653c3eaac47fd825db8f29d90244fb578a9 Mon Sep 17 00:00:00 2001 From: linuxfight Date: Tue, 15 Aug 2023 00:46:15 +0300 Subject: [PATCH] Added manager --- DangerousD/GameCore/Managers/SoundManager.cs | 83 ++++++++++++++++++-- 1 file changed, 78 insertions(+), 5 deletions(-) diff --git a/DangerousD/GameCore/Managers/SoundManager.cs b/DangerousD/GameCore/Managers/SoundManager.cs index 5997394..86e6282 100644 --- a/DangerousD/GameCore/Managers/SoundManager.cs +++ b/DangerousD/GameCore/Managers/SoundManager.cs @@ -1,13 +1,86 @@ using System; using System.Collections.Generic; using System.Text; +using System.IO; +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Audio; +using Microsoft.Xna.Framework.Content; namespace DangerousD.GameCore { - class SoundManager + public class SoundManager { - public void LoadSounds() { } - public void StartSound(string soundName) { }//GameManager.SendSound - public void StopAllSounds() { } + public Dictionary Sounds = new Dictionary(); // словарь со звуками где строка - название файла + public List PlayingSounds = new List(); // список со всеми звуками, которые проигрываются + public string SoundDirectory = "Sounds"; // папка со звуками там где exe + public float MaxSoundDistance = 1500; // максимальная дальность звука + + public void LoadSounds(ContentManager content) // метод для загрузки звуков из папки + { + var soundFiles = Directory.GetFiles(SoundDirectory); + foreach (var soundFile in soundFiles) + { + Sounds.Add(soundFile, content.Load(soundFile)); + } + } + + public void StartSound(string soundName) // запустить звук у которого нет позиции + { + var sound = new Sound(Sounds[soundName]); + sound.SoundEffect.IsLooped = false; + sound.SoundEffect.Play(); + PlayingSounds.Add(sound); + } + + public void StartSound(string soundName, Vector2 soundPos, Vector2 playerPos) // запустить звук у которого есть позиция + { + var sound = new Sound(Sounds[soundName], soundPos); + sound.SoundEffect.IsLooped = false; + sound.SoundEffect.Volume = (float)sound.GetDistance(playerPos) / MaxSoundDistance; + sound.SoundEffect.Play(); + PlayingSounds.Add(sound); + }//GameManager.SendSound + public void StopAllSounds() // остановка всех звуков + { + foreach (var sound in PlayingSounds) + sound.SoundEffect.Stop(); + PlayingSounds.Clear(); + } + + public void Update(Vector2 playerPos) // апдейт, тут происходит изменение громкости + { + foreach (var sound in PlayingSounds) + { + if (!sound.isAmbient) + sound.SoundEffect.Volume = (float)sound.GetDistance(playerPos) / MaxSoundDistance; + if (sound.SoundEffect.State == SoundState.Stopped) + PlayingSounds.Remove(sound); + } + } } -} + + public class Sound + { + public SoundEffectInstance SoundEffect { get; set; } + public Vector2 Position { get; set; } // позиция для эффекта + public bool isAmbient { get; } + + public Sound(SoundEffectInstance soundEffect) // конструктор для музыки и эмбиента + { + SoundEffect = soundEffect; + isAmbient = true; + } + + public Sound(SoundEffectInstance soundEffect, Vector2 position) // конструктор для эффектов по типу криков зомби + { + isAmbient = false; + SoundEffect = soundEffect; + Position = position; + } + + public double GetDistance(Vector2 playerPos) // получение дистанции до объедка от игрока + { + return Math.Sqrt(Math.Pow(Position.X - playerPos.X, 2) + Math.Pow(Position.Y - playerPos.Y, 2)); + } + } +} \ No newline at end of file