MainMenuScreen.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375
  1. #region File Description
  2. //-----------------------------------------------------------------------------
  3. // MainMenuScreen.cs
  4. //
  5. // Microsoft XNA Community Game Platform
  6. // Copyright (C) Microsoft Corporation. All rights reserved.
  7. //-----------------------------------------------------------------------------
  8. #endregion
  9. #region Using Statements
  10. using System;
  11. using Microsoft.Xna.Framework;
  12. using Microsoft.Xna.Framework.Content;
  13. using Microsoft.Xna.Framework.Graphics;
  14. using RolePlayingGameData;
  15. #endregion
  16. namespace RolePlaying
  17. {
  18. /// <summary>
  19. /// The main menu screen is the first thing displayed when the game starts up.
  20. /// </summary>
  21. class MainMenuScreen : MenuScreen
  22. {
  23. #region Graphics Data
  24. private Texture2D backgroundTexture;
  25. private Vector2 backgroundPosition;
  26. private Texture2D descriptionAreaTexture;
  27. private Vector2 descriptionAreaPosition;
  28. private Vector2 descriptionAreaTextPosition;
  29. private Texture2D iconTexture;
  30. private Vector2 iconPosition;
  31. private Texture2D backTexture;
  32. private Vector2 backPosition;
  33. private Texture2D selectTexture;
  34. private Vector2 selectPosition;
  35. private Texture2D plankTexture1, plankTexture2, plankTexture3;
  36. #endregion
  37. #region Menu Entries
  38. MenuEntry newGameMenuEntry, exitGameMenuEntry;
  39. MenuEntry saveGameMenuEntry, loadGameMenuEntry;
  40. MenuEntry controlsMenuEntry, helpMenuEntry;
  41. #endregion
  42. #region Initialization
  43. /// <summary>
  44. /// Constructor fills in the menu contents.
  45. /// </summary>
  46. public MainMenuScreen()
  47. : base()
  48. {
  49. // add the New Game entry
  50. newGameMenuEntry = new MenuEntry("New Game");
  51. newGameMenuEntry.Description = "Start a New Game";
  52. newGameMenuEntry.Font = Fonts.HeaderFont;
  53. newGameMenuEntry.Position = new Vector2(715, 0f);
  54. newGameMenuEntry.Selected += NewGameMenuEntrySelected;
  55. MenuEntries.Add(newGameMenuEntry);
  56. // add the Save Game menu entry,
  57. // if the game has started but is not in combat
  58. if (Session.IsActive && !CombatEngine.IsActive)
  59. {
  60. saveGameMenuEntry = new MenuEntry("Save Game");
  61. saveGameMenuEntry.Description = "Save the Game";
  62. saveGameMenuEntry.Font = Fonts.HeaderFont;
  63. saveGameMenuEntry.Position = new Vector2(730, 0f);
  64. saveGameMenuEntry.Selected += SaveGameMenuEntrySelected;
  65. MenuEntries.Add(saveGameMenuEntry);
  66. }
  67. else
  68. {
  69. saveGameMenuEntry = null;
  70. }
  71. // add the Load Game menu entry
  72. loadGameMenuEntry = new MenuEntry("Load Game");
  73. loadGameMenuEntry.Description = "Load the Game";
  74. loadGameMenuEntry.Font = Fonts.HeaderFont;
  75. loadGameMenuEntry.Position = new Vector2(700, 0f);
  76. loadGameMenuEntry.Selected += LoadGameMenuEntrySelected;
  77. MenuEntries.Add(loadGameMenuEntry);
  78. // add the Controls menu entry
  79. controlsMenuEntry = new MenuEntry("Controls");
  80. controlsMenuEntry.Description = "View Game Controls";
  81. controlsMenuEntry.Font = Fonts.HeaderFont;
  82. controlsMenuEntry.Position = new Vector2(720, 0f);
  83. controlsMenuEntry.Selected += ControlsMenuEntrySelected;
  84. MenuEntries.Add(controlsMenuEntry);
  85. // add the Help menu entry
  86. helpMenuEntry = new MenuEntry("Help");
  87. helpMenuEntry.Description = "View Game Help";
  88. helpMenuEntry.Font = Fonts.HeaderFont;
  89. helpMenuEntry.Position = new Vector2(700, 0f);
  90. helpMenuEntry.Selected += HelpMenuEntrySelected;
  91. MenuEntries.Add(helpMenuEntry);
  92. // create the Exit menu entry
  93. exitGameMenuEntry = new MenuEntry("Exit");
  94. exitGameMenuEntry.Description = "Quit the Game";
  95. exitGameMenuEntry.Font = Fonts.HeaderFont;
  96. exitGameMenuEntry.Position = new Vector2(720, 0f);
  97. exitGameMenuEntry.Selected += OnCancel;
  98. MenuEntries.Add(exitGameMenuEntry);
  99. // start the menu music
  100. AudioManager.PushMusic("MainTheme");
  101. }
  102. /// <summary>
  103. /// Load the graphics content for this screen.
  104. /// </summary>
  105. public override void LoadContent()
  106. {
  107. // load the textures
  108. ContentManager content = ScreenManager.Game.Content;
  109. backgroundTexture = content.Load<Texture2D>(@"Textures\MainMenu\MainMenu");
  110. descriptionAreaTexture =
  111. content.Load<Texture2D>(@"Textures\MainMenu\MainMenuInfoSpace");
  112. iconTexture = content.Load<Texture2D>(@"Textures\MainMenu\GameLogo");
  113. plankTexture1 =
  114. content.Load<Texture2D>(@"Textures\MainMenu\MainMenuPlank");
  115. plankTexture2 =
  116. content.Load<Texture2D>(@"Textures\MainMenu\MainMenuPlank02");
  117. plankTexture3 =
  118. content.Load<Texture2D>(@"Textures\MainMenu\MainMenuPlank03");
  119. backTexture = content.Load<Texture2D>(@"Textures\Buttons\BButton");
  120. selectTexture = content.Load<Texture2D>(@"Textures\Buttons\AButton");
  121. // calculate the texture positions
  122. Viewport viewport = ScreenManager.GraphicsDevice.Viewport;
  123. backgroundPosition = new Vector2(
  124. (viewport.Width - backgroundTexture.Width) / 2,
  125. (viewport.Height - backgroundTexture.Height) / 2);
  126. descriptionAreaPosition = backgroundPosition + new Vector2(158, 130);
  127. descriptionAreaTextPosition = backgroundPosition + new Vector2(158, 350);
  128. iconPosition = backgroundPosition + new Vector2(170, 80);
  129. backPosition = backgroundPosition + new Vector2(225, 610);
  130. selectPosition = backgroundPosition + new Vector2(1120, 610);
  131. // set the textures on each menu entry
  132. newGameMenuEntry.Texture = plankTexture3;
  133. if (saveGameMenuEntry != null)
  134. {
  135. saveGameMenuEntry.Texture = plankTexture2;
  136. }
  137. loadGameMenuEntry.Texture = plankTexture1;
  138. controlsMenuEntry.Texture = plankTexture2;
  139. helpMenuEntry.Texture = plankTexture3;
  140. exitGameMenuEntry.Texture = plankTexture1;
  141. // now that they have textures, set the proper positions on the menu entries
  142. for (int i = 0; i < MenuEntries.Count; i++)
  143. {
  144. MenuEntries[i].Position = new Vector2(
  145. MenuEntries[i].Position.X,
  146. 500f - ((MenuEntries[i].Texture.Height - 10) *
  147. (MenuEntries.Count - 1 - i)));
  148. }
  149. base.LoadContent();
  150. }
  151. #endregion
  152. #region Updating
  153. /// <summary>
  154. /// Handles user input.
  155. /// </summary>
  156. public override void HandleInput()
  157. {
  158. if (InputManager.IsActionTriggered(InputManager.Action.Back) &&
  159. Session.IsActive)
  160. {
  161. AudioManager.PopMusic();
  162. ExitScreen();
  163. return;
  164. }
  165. base.HandleInput();
  166. }
  167. /// <summary>
  168. /// Event handler for when the New Game menu entry is selected.
  169. /// </summary>
  170. void NewGameMenuEntrySelected(object sender, EventArgs e)
  171. {
  172. if (Session.IsActive)
  173. {
  174. ExitScreen();
  175. }
  176. ContentManager content = ScreenManager.Game.Content;
  177. LoadingScreen.Load(ScreenManager, true, new GameplayScreen(
  178. content.Load<GameStartDescription>("MainGameDescription")));
  179. }
  180. /// <summary>
  181. /// Event handler for when the Save Game menu entry is selected.
  182. /// </summary>
  183. void SaveGameMenuEntrySelected(object sender, EventArgs e)
  184. {
  185. ScreenManager.AddScreen(
  186. new SaveLoadScreen(SaveLoadScreen.SaveLoadScreenMode.Save));
  187. }
  188. /// <summary>
  189. /// Event handler for when the Load Game menu entry is selected.
  190. /// </summary>
  191. void LoadGameMenuEntrySelected(object sender, EventArgs e)
  192. {
  193. SaveLoadScreen loadGameScreen =
  194. new SaveLoadScreen(SaveLoadScreen.SaveLoadScreenMode.Load);
  195. loadGameScreen.LoadingSaveGame += new SaveLoadScreen.LoadingSaveGameHandler(
  196. loadGameScreen_LoadingSaveGame);
  197. ScreenManager.AddScreen(loadGameScreen);
  198. }
  199. /// <summary>
  200. /// Handle save-game-to-load-selected events from the SaveLoadScreen.
  201. /// </summary>
  202. void loadGameScreen_LoadingSaveGame(SaveGameDescription saveGameDescription)
  203. {
  204. if (Session.IsActive)
  205. {
  206. ExitScreen();
  207. }
  208. LoadingScreen.Load(ScreenManager, true,
  209. new GameplayScreen(saveGameDescription));
  210. }
  211. /// <summary>
  212. /// Event handler for when the Controls menu entry is selected.
  213. /// </summary>
  214. void ControlsMenuEntrySelected(object sender, EventArgs e)
  215. {
  216. ScreenManager.AddScreen(new ControlsScreen());
  217. }
  218. /// <summary>
  219. /// Event handler for when the Help menu entry is selected.
  220. /// </summary>
  221. void HelpMenuEntrySelected(object sender, EventArgs e)
  222. {
  223. ScreenManager.AddScreen(new HelpScreen());
  224. }
  225. /// <summary>
  226. /// When the user cancels the main menu,
  227. /// or when the Exit Game menu entry is selected.
  228. /// </summary>
  229. protected override void OnCancel()
  230. {
  231. // add a confirmation message box
  232. string message = String.Empty;
  233. if (Session.IsActive)
  234. {
  235. message =
  236. "Are you sure you want to exit? All unsaved progress will be lost.";
  237. }
  238. else
  239. {
  240. message = "Are you sure you want to exit?";
  241. }
  242. MessageBoxScreen confirmExitMessageBox = new MessageBoxScreen(message);
  243. confirmExitMessageBox.Accepted += ConfirmExitMessageBoxAccepted;
  244. ScreenManager.AddScreen(confirmExitMessageBox);
  245. }
  246. /// <summary>
  247. /// Event handler for when the user selects Yes
  248. /// on the "Are you sure?" message box.
  249. /// </summary>
  250. void ConfirmExitMessageBoxAccepted(object sender, EventArgs e)
  251. {
  252. ScreenManager.Game.Exit();
  253. }
  254. #endregion
  255. #region Drawing
  256. /// <summary>
  257. /// Draw this screen.
  258. /// </summary>
  259. public override void Draw(GameTime gameTime)
  260. {
  261. SpriteBatch spriteBatch = ScreenManager.SpriteBatch;
  262. spriteBatch.Begin();
  263. // draw the background images
  264. spriteBatch.Draw(backgroundTexture, backgroundPosition, Color.White);
  265. spriteBatch.Draw(descriptionAreaTexture, descriptionAreaPosition,
  266. Color.White);
  267. spriteBatch.Draw(iconTexture, iconPosition, Color.White);
  268. // Draw each menu entry in turn.
  269. for (int i = 0; i < MenuEntries.Count; i++)
  270. {
  271. MenuEntry menuEntry = MenuEntries[i];
  272. bool isSelected = IsActive && (i == selectedEntry);
  273. menuEntry.Draw(this, isSelected, gameTime);
  274. }
  275. // draw the description text for the selected entry
  276. MenuEntry selectedMenuEntry = SelectedMenuEntry;
  277. if ((selectedMenuEntry != null) &&
  278. !String.IsNullOrEmpty(selectedMenuEntry.Description))
  279. {
  280. Vector2 textSize =
  281. Fonts.DescriptionFont.MeasureString(selectedMenuEntry.Description);
  282. Vector2 textPosition = descriptionAreaTextPosition + new Vector2(
  283. (float)Math.Floor((descriptionAreaTexture.Width - textSize.X) / 2),
  284. 0f);
  285. spriteBatch.DrawString(Fonts.DescriptionFont,
  286. selectedMenuEntry.Description, textPosition, Color.White);
  287. }
  288. // draw the select instruction
  289. spriteBatch.Draw(selectTexture, selectPosition, Color.White);
  290. spriteBatch.DrawString(Fonts.ButtonNamesFont, "Select",
  291. new Vector2(
  292. selectPosition.X - Fonts.ButtonNamesFont.MeasureString("Select").X - 5,
  293. selectPosition.Y + 5), Color.White);
  294. // if we are in-game, draw the back instruction
  295. if (Session.IsActive)
  296. {
  297. spriteBatch.Draw(backTexture, backPosition, Color.White);
  298. spriteBatch.DrawString(Fonts.ButtonNamesFont, "Resume",
  299. new Vector2(backPosition.X + 55, backPosition.Y + 5), Color.White);
  300. }
  301. spriteBatch.End();
  302. }
  303. #endregion
  304. }
  305. }