/* * PauseMenu.cs * Authors: Mike DeMauro * Copyright (c) 2007-2008 Cornell University This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ using System; using System.Collections.Generic; using System.Text; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Input; using Util; namespace StellarProspector { /// /// Defines how the pause menu will work for Stellar Prospector /// internal class PauseMenu : GameScreen { #region Fields /// /// List of menu items displayed within the pause menu /// List m_MenuItems = new List(); /// /// The currently selected menu items /// int m_ItemSelected; /// /// The sprite batch used for rendering textures /// SpriteBatch m_SpriteBatch; /// /// The sprite font used for rendering text /// SpriteFont m_SpriteFont; /// /// Reference to the logger used for Stellar Prospector /// Logger mLogger; /// /// Input handler for processing input for the pause menu /// InputHandler inputHandler; /// /// Reference to the Stellar Prospector game screen /// StellarProspectorGameScreen m_ssScreen; #endregion #region Creation /// /// Constructor for the Pause Menu /// /// Reference to the Stellar Prospector game screen whcih created this /// Reference to the logger that is used for Stellar Prospector public PauseMenu(StellarProspectorGameScreen caller, Logger logger) { m_ssScreen = caller; mLogger = logger; } #endregion #region Initialization /// /// Initializes all upon creation needed components /// public override void Initialize() { inputHandler = GetInputHandler(); m_MenuItems.Add("Resume"); m_MenuItems.Add("Reset"); m_MenuItems.Add("Phase 1"); m_MenuItems.Add("Phase 2"); m_MenuItems.Add("Phase 3"); m_MenuItems.Add("Main Menu"); inputHandler.Initialize(); inputHandler.BindButton(Keys.Down, Trigger.Activated, (int)EventCodes.Menu_Down); inputHandler.BindButton(Keys.Up, Trigger.Activated, (int)EventCodes.Menu_Up); inputHandler.BindButton(Keys.Enter, Trigger.Activated, (int)EventCodes.Menu_Select); inputHandler.BindButton(Keys.Escape, Trigger.Activated, (int)EventCodes.Menu_Cancel); base.Initialize(); } /// /// Reinitializes changable values back to the initial values /// public override void Reinitialize() { inputHandler.Enable(); this.Enabled = true; this.Visible = true; m_ssScreen.Visible = true; } #endregion #region Management /// /// Loads in necessary content dependent information /// protected override void LoadContent() { m_SpriteBatch = new SpriteBatch(GraphicsDevice); m_SpriteFont = Content.Load(@"Fonts\menufont"); base.LoadContent(); } /// /// Disposes of unmanaged content dependent objects /// /// Whether or not this is currently being disposed protected override void Dispose(bool disposing) { if (disposing) { m_SpriteBatch.Dispose(); } base.Dispose(disposing); } #endregion #region Update /// /// Updates the pause menu /// /// Time that has passed in-game public override void Update(GameTime gameTime) { base.Update(gameTime); while (inputHandler.HasEvent()) { InputEvent e = inputHandler.GetNextEvent(); switch ((EventCodes)e.EventCode) { case EventCodes.Menu_Down: m_ItemSelected = (m_ItemSelected + 1) % m_MenuItems.Count; SoundManager.SoundManager.PlayEffect("Menu_Move"); e.WriteToLog(mLogger, "SP_Menu_Down"); break; case EventCodes.Menu_Up: m_ItemSelected = (m_ItemSelected - 1 + m_MenuItems.Count) % m_MenuItems.Count; SoundManager.SoundManager.PlayEffect("Menu_Move"); e.WriteToLog(mLogger, "SP_Menu_Up"); break; case EventCodes.Menu_Select: e.WriteToLog(mLogger, "SP_Menu_Select"); SoundManager.SoundManager.PlayEffect("Menu_Select"); if (m_MenuItems[m_ItemSelected] == "Resume") { m_ssScreen.SetPaused(false); } else if (m_MenuItems[m_ItemSelected] == "Reset") { m_ssScreen.ResetGame(); } else if (m_MenuItems[m_ItemSelected] == "Phase 1") { m_ssScreen.SetProgress(0); m_ssScreen.setPhase(Phases.One); } else if (m_MenuItems[m_ItemSelected] == "Phase 2") { m_ssScreen.SetProgress((int)(Settings.MaxProgress * StellarProspectorGameScreen.PHASE_TWO_PERCENT)); m_ssScreen.setPhase(Phases.Two); } else if (m_MenuItems[m_ItemSelected] == "Phase 3") { m_ssScreen.SetProgress((int)(Settings.MaxProgress * StellarProspectorGameScreen.PHASE_THREE_PERCENT)); m_ssScreen.setPhase(Phases.Three); } else if (m_MenuItems[m_ItemSelected] == "Main Menu") { Done(); } if (m_MenuItems[m_ItemSelected] != "Main Menu") { mLogger.Write((int)EventCodes.Resume, "SP_UnPause"); } Done(); break; case EventCodes.Menu_Cancel: e.WriteToLog(mLogger, "SP_Menu_Cancel"); mLogger.Write((int)EventCodes.Resume, "SP_UnPause"); Done(); m_ssScreen.SetPaused(false); break; } } } #endregion #region Render /// /// Renders the pause menu /// /// Time that has passed in-game public override void Draw(GameTime gameTime) { base.Draw(gameTime); Vector2 location = new Vector2(100, 50); m_SpriteBatch.Begin(); m_SpriteBatch.DrawString(m_SpriteFont, "PAUSED", location, Color.Green); for (int i = 0; i < m_MenuItems.Count; i++) { location.Y += 50; if (i == m_ItemSelected) { m_SpriteBatch.DrawString(m_SpriteFont, m_MenuItems[i], location, Color.Yellow); } else { m_SpriteBatch.DrawString(m_SpriteFont, m_MenuItems[i], location, Color.White); } } m_SpriteBatch.End(); } #endregion } }