using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Ninject;
using System.Collections.Generic;
using V3.Data;
using V3.Input;
using V3.Widgets;
namespace V3.Screens
{
///
/// The screen for the load menu.
///
// ReSharper disable once ClassNeverInstantiated.Global
public sealed class LoadScreen : AbstractScreen, IInitializable
{
private readonly ContentManager mContentManager;
private readonly IMenu mMenu;
private readonly ISaveGameManager mSaveGameManager;
private readonly MenuActions mMenuActions;
private readonly WidgetFactory mWidgetFactory;
private Texture2D mRectangle;
private Button mButtonBack;
private SelectButton mButtonSaveGame;
private Button mButtonLoad;
private List mSaveGames;
///
/// Creates a new load screen.
///
public LoadScreen(ContentManager contentManager, FormMenu menu,
ISaveGameManager saveGameManager, MenuActions menuActions,
WidgetFactory widgetFactory)
: base(false, true)
{
mContentManager = contentManager;
mMenu = menu;
mSaveGameManager = saveGameManager;
mMenuActions = menuActions;
mWidgetFactory = widgetFactory;
}
public void Initialize()
{
mRectangle = mContentManager.Load("Sprites/WhiteRectangle");
mButtonBack = mWidgetFactory.CreateButton("Zurück");
mButtonLoad = mWidgetFactory.CreateButton("Laden");
mButtonSaveGame = mWidgetFactory.CreateSelectButton();
mSaveGames = mSaveGameManager.GetSaveGames();
foreach (var saveGame in mSaveGames)
{
mButtonSaveGame.Values.Add(GetSaveGameString(saveGame));
}
mButtonSaveGame.SelectedIndex = mSaveGames.Count - 1;
mMenu.Widgets.Add(mWidgetFactory.CreateEmptyWidget());
mMenu.Widgets.Add(mButtonBack);
mMenu.Widgets.Add(mWidgetFactory.CreateLabel("Spielstand"));
mMenu.Widgets.Add(mButtonSaveGame);
mMenu.Widgets.Add(mWidgetFactory.CreateEmptyWidget());
mMenu.Widgets.Add(mButtonLoad);
}
public override bool HandleKeyEvent(IKeyEvent keyEvent)
{
if (keyEvent.KeyState == KeyState.Down && keyEvent.Key == Keys.Escape)
mMenuActions.Close(this);
return true;
}
public override bool HandleMouseEvent(IMouseEvent mouseEvent)
{
mMenu.HandleMouseEvent(mouseEvent);
return true;
}
///
/// Draws this object using the given sprite batch.
///
/// a snapshot of the game time
/// the sprite batch to use for drawing
/// this object
public override void Draw(GameTime gameTime, SpriteBatch spriteBatch)
{
var backgroundRectangle = new Rectangle((int)mMenu.Position.X,
(int)mMenu.Position.Y, (int)mMenu.Size.X, (int)mMenu.Size.Y);
backgroundRectangle.X -= 30;
backgroundRectangle.Y -= 30;
backgroundRectangle.Width += 60;
backgroundRectangle.Height += 60;
spriteBatch.Begin();
spriteBatch.Draw(mRectangle, backgroundRectangle, Color.LightGray);
spriteBatch.End();
mMenu.Draw(spriteBatch);
}
public override void Update(GameTime gameTime)
{
if (mButtonBack.IsClicked)
{
mMenuActions.Close(this);
}
else if (mButtonLoad.IsClicked)
{
var saveGame = mSaveGames[mButtonSaveGame.SelectedIndex];
mMenuActions.LoadGame(saveGame);
}
mMenu.Update();
}
private static string GetSaveGameString(ISaveGame saveGame)
{
return saveGame.Timestamp.ToString("s");
}
}
}