102 lines
3.0 KiB
C#
102 lines
3.0 KiB
C#
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<IScreen> _Screens;
|
|
private List<IScreen> _ToRemove;
|
|
private List<IScreen> _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<IScreen>();
|
|
_ToRemove = new List<IScreen>();
|
|
_ToAdd = new List<IScreen>();
|
|
_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);
|
|
}
|
|
}
|
|
}
|