#region File Description //----------------------------------------------------------------------------- // MainMenuScreen.cs // // Microsoft XNA Community Game Platform // Copyright (C) Microsoft Corporation. All rights reserved. //----------------------------------------------------------------------------- #endregion #region Using Statements using System; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.Graphics; using RolePlayingGameData; #endregion namespace RolePlaying { /// /// The main menu screen is the first thing displayed when the game starts up. /// class MainMenuScreen : MenuScreen { #region Graphics Data private Texture2D backgroundTexture; private Vector2 backgroundPosition; private Texture2D descriptionAreaTexture; private Vector2 descriptionAreaPosition; private Vector2 descriptionAreaTextPosition; private Texture2D iconTexture; private Vector2 iconPosition; private Texture2D backTexture; private Vector2 backPosition; private Texture2D selectTexture; private Vector2 selectPosition; private Texture2D plankTexture1, plankTexture2, plankTexture3; #endregion #region Menu Entries MenuEntry newGameMenuEntry, exitGameMenuEntry; MenuEntry saveGameMenuEntry, loadGameMenuEntry; MenuEntry controlsMenuEntry, helpMenuEntry; #endregion #region Initialization /// /// Constructor fills in the menu contents. /// public MainMenuScreen() : base() { // add the New Game entry newGameMenuEntry = new MenuEntry("New Game"); newGameMenuEntry.Description = "Start a New Game"; newGameMenuEntry.Font = Fonts.HeaderFont; newGameMenuEntry.Position = new Vector2(715, 0f); newGameMenuEntry.Selected += NewGameMenuEntrySelected; MenuEntries.Add(newGameMenuEntry); // add the Save Game menu entry, // if the game has started but is not in combat if (Session.IsActive && !CombatEngine.IsActive) { saveGameMenuEntry = new MenuEntry("Save Game"); saveGameMenuEntry.Description = "Save the Game"; saveGameMenuEntry.Font = Fonts.HeaderFont; saveGameMenuEntry.Position = new Vector2(730, 0f); saveGameMenuEntry.Selected += SaveGameMenuEntrySelected; MenuEntries.Add(saveGameMenuEntry); } else { saveGameMenuEntry = null; } // add the Load Game menu entry loadGameMenuEntry = new MenuEntry("Load Game"); loadGameMenuEntry.Description = "Load the Game"; loadGameMenuEntry.Font = Fonts.HeaderFont; loadGameMenuEntry.Position = new Vector2(700, 0f); loadGameMenuEntry.Selected += LoadGameMenuEntrySelected; MenuEntries.Add(loadGameMenuEntry); // add the Controls menu entry controlsMenuEntry = new MenuEntry("Controls"); controlsMenuEntry.Description = "View Game Controls"; controlsMenuEntry.Font = Fonts.HeaderFont; controlsMenuEntry.Position = new Vector2(720, 0f); controlsMenuEntry.Selected += ControlsMenuEntrySelected; MenuEntries.Add(controlsMenuEntry); // add the Help menu entry helpMenuEntry = new MenuEntry("Help"); helpMenuEntry.Description = "View Game Help"; helpMenuEntry.Font = Fonts.HeaderFont; helpMenuEntry.Position = new Vector2(700, 0f); helpMenuEntry.Selected += HelpMenuEntrySelected; MenuEntries.Add(helpMenuEntry); // create the Exit menu entry exitGameMenuEntry = new MenuEntry("Exit"); exitGameMenuEntry.Description = "Quit the Game"; exitGameMenuEntry.Font = Fonts.HeaderFont; exitGameMenuEntry.Position = new Vector2(720, 0f); exitGameMenuEntry.Selected += OnCancel; MenuEntries.Add(exitGameMenuEntry); // start the menu music AudioManager.PushMusic("MainTheme"); } /// /// Load the graphics content for this screen. /// public override void LoadContent() { // load the textures ContentManager content = ScreenManager.Game.Content; backgroundTexture = content.Load(@"Textures\MainMenu\MainMenu"); descriptionAreaTexture = content.Load(@"Textures\MainMenu\MainMenuInfoSpace"); iconTexture = content.Load(@"Textures\MainMenu\GameLogo"); plankTexture1 = content.Load(@"Textures\MainMenu\MainMenuPlank"); plankTexture2 = content.Load(@"Textures\MainMenu\MainMenuPlank02"); plankTexture3 = content.Load(@"Textures\MainMenu\MainMenuPlank03"); backTexture = content.Load(@"Textures\Buttons\BButton"); selectTexture = content.Load(@"Textures\Buttons\AButton"); // calculate the texture positions Viewport viewport = ScreenManager.GraphicsDevice.Viewport; backgroundPosition = new Vector2( (viewport.Width - backgroundTexture.Width) / 2, (viewport.Height - backgroundTexture.Height) / 2); descriptionAreaPosition = backgroundPosition + new Vector2(158, 130); descriptionAreaTextPosition = backgroundPosition + new Vector2(158, 350); iconPosition = backgroundPosition + new Vector2(170, 80); backPosition = backgroundPosition + new Vector2(225, 610); selectPosition = backgroundPosition + new Vector2(1120, 610); // set the textures on each menu entry newGameMenuEntry.Texture = plankTexture3; if (saveGameMenuEntry != null) { saveGameMenuEntry.Texture = plankTexture2; } loadGameMenuEntry.Texture = plankTexture1; controlsMenuEntry.Texture = plankTexture2; helpMenuEntry.Texture = plankTexture3; exitGameMenuEntry.Texture = plankTexture1; // now that they have textures, set the proper positions on the menu entries for (int i = 0; i < MenuEntries.Count; i++) { MenuEntries[i].Position = new Vector2( MenuEntries[i].Position.X, 500f - ((MenuEntries[i].Texture.Height - 10) * (MenuEntries.Count - 1 - i))); } base.LoadContent(); } #endregion #region Updating /// /// Handles user input. /// public override void HandleInput() { if (InputManager.IsActionTriggered(InputManager.Action.Back) && Session.IsActive) { AudioManager.PopMusic(); ExitScreen(); return; } base.HandleInput(); } /// /// Event handler for when the New Game menu entry is selected. /// void NewGameMenuEntrySelected(object sender, EventArgs e) { if (Session.IsActive) { ExitScreen(); } ContentManager content = ScreenManager.Game.Content; LoadingScreen.Load(ScreenManager, true, new GameplayScreen( content.Load("MainGameDescription"))); } /// /// Event handler for when the Save Game menu entry is selected. /// void SaveGameMenuEntrySelected(object sender, EventArgs e) { ScreenManager.AddScreen( new SaveLoadScreen(SaveLoadScreen.SaveLoadScreenMode.Save)); } /// /// Event handler for when the Load Game menu entry is selected. /// void LoadGameMenuEntrySelected(object sender, EventArgs e) { SaveLoadScreen loadGameScreen = new SaveLoadScreen(SaveLoadScreen.SaveLoadScreenMode.Load); loadGameScreen.LoadingSaveGame += new SaveLoadScreen.LoadingSaveGameHandler( loadGameScreen_LoadingSaveGame); ScreenManager.AddScreen(loadGameScreen); } /// /// Handle save-game-to-load-selected events from the SaveLoadScreen. /// void loadGameScreen_LoadingSaveGame(SaveGameDescription saveGameDescription) { if (Session.IsActive) { ExitScreen(); } LoadingScreen.Load(ScreenManager, true, new GameplayScreen(saveGameDescription)); } /// /// Event handler for when the Controls menu entry is selected. /// void ControlsMenuEntrySelected(object sender, EventArgs e) { ScreenManager.AddScreen(new ControlsScreen()); } /// /// Event handler for when the Help menu entry is selected. /// void HelpMenuEntrySelected(object sender, EventArgs e) { ScreenManager.AddScreen(new HelpScreen()); } /// /// When the user cancels the main menu, /// or when the Exit Game menu entry is selected. /// protected override void OnCancel() { // add a confirmation message box string message = String.Empty; if (Session.IsActive) { message = "Are you sure you want to exit? All unsaved progress will be lost."; } else { message = "Are you sure you want to exit?"; } MessageBoxScreen confirmExitMessageBox = new MessageBoxScreen(message); confirmExitMessageBox.Accepted += ConfirmExitMessageBoxAccepted; ScreenManager.AddScreen(confirmExitMessageBox); } /// /// Event handler for when the user selects Yes /// on the "Are you sure?" message box. /// void ConfirmExitMessageBoxAccepted(object sender, EventArgs e) { ScreenManager.Game.Exit(); } #endregion #region Drawing /// /// Draw this screen. /// public override void Draw(GameTime gameTime) { SpriteBatch spriteBatch = ScreenManager.SpriteBatch; spriteBatch.Begin(); // draw the background images spriteBatch.Draw(backgroundTexture, backgroundPosition, Color.White); spriteBatch.Draw(descriptionAreaTexture, descriptionAreaPosition, Color.White); spriteBatch.Draw(iconTexture, iconPosition, Color.White); // Draw each menu entry in turn. for (int i = 0; i < MenuEntries.Count; i++) { MenuEntry menuEntry = MenuEntries[i]; bool isSelected = IsActive && (i == selectedEntry); menuEntry.Draw(this, isSelected, gameTime); } // draw the description text for the selected entry MenuEntry selectedMenuEntry = SelectedMenuEntry; if ((selectedMenuEntry != null) && !String.IsNullOrEmpty(selectedMenuEntry.Description)) { Vector2 textSize = Fonts.DescriptionFont.MeasureString(selectedMenuEntry.Description); Vector2 textPosition = descriptionAreaTextPosition + new Vector2( (float)Math.Floor((descriptionAreaTexture.Width - textSize.X) / 2), 0f); spriteBatch.DrawString(Fonts.DescriptionFont, selectedMenuEntry.Description, textPosition, Color.White); } // draw the select instruction spriteBatch.Draw(selectTexture, selectPosition, Color.White); spriteBatch.DrawString(Fonts.ButtonNamesFont, "Select", new Vector2( selectPosition.X - Fonts.ButtonNamesFont.MeasureString("Select").X - 5, selectPosition.Y + 5), Color.White); // if we are in-game, draw the back instruction if (Session.IsActive) { spriteBatch.Draw(backTexture, backPosition, Color.White); spriteBatch.DrawString(Fonts.ButtonNamesFont, "Resume", new Vector2(backPosition.X + 55, backPosition.Y + 5), Color.White); } spriteBatch.End(); } #endregion } }