using System; using System.Collections.Generic; using System.Text; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Input; using SynthySound; using Microsoft.Xna.Framework.Audio; using EvilSatellites.Screens; namespace EvilSatellites { public class ScreenManager : DrawableGameComponent { private List _Screens; private List _ToRemove; private List _ToAdd; private IScreen _CurrentScreen; private Game _Game; private bool _Running = false; public Synthy Sound; public MusicManager Music; public AI Computer; public VibrationManager Vibrations; public FDNReverb EnvironmentEffect; public ScreenManager(Game instance): base(instance) { Sound = new Synthy(); Music = new MusicManager(Sound); Computer = new AI(Sound); Vibrations = new VibrationManager(PlayerIndex.One); EnvironmentEffect = Sound.CreateReverb(); EnvironmentEffect.Delay = 0.03; EnvironmentEffect.Wet = 30; EnvironmentEffect.T60 = 1; EnvironmentEffect.Defusion = 1f; EnvironmentEffect.FreePath = 0.02; Sound.SetMaxDistance(150); _Game = instance; _Screens = new List(); _ToRemove = new List(); _ToAdd = new List(); _CurrentScreen = null; } public override void Initialize() { _Running = true; foreach (var screen in _Screens) { screen.Activate(); } base.Initialize(); } public void AddScreen(IScreen screen) { screen.Manager = this; _ToAdd.Add(screen); } public void RemoveScreen(IScreen screen) { if (!_Screens.Contains(screen)) { throw new Exception("Cannot remove a screen that isn't added to manager"); } _ToRemove.Add(screen); } public void Update(GameTime gameTime) { Vibrations.Update((float)gameTime.ElapsedGameTime.TotalMilliseconds); if (_ToAdd.Count > 0) { foreach (var screen in _ToAdd) { screen.Activate(); _Screens.Add(screen); } _ToAdd.Clear(); } if (_ToRemove.Count > 0) { foreach (var screen in _ToRemove) { screen.Deactivate(); _Screens.Remove(screen); } _ToRemove.Clear(); } Sound.Update(); var input = Keyboard.GetState(); foreach (var screen in _Screens) { if (screen.State == ScreenState.Active) screen.HandleInput(gameTime, input); screen.Update(gameTime); } base.Update(gameTime); } } }