MainMenuScreen.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363
  1. //-----------------------------------------------------------------------------
  2. // MainMenuScreen.cs
  3. //
  4. // Microsoft XNA Community Game Platform
  5. // Copyright (C) Microsoft Corporation. All rights reserved.
  6. //-----------------------------------------------------------------------------
  7. using System;
  8. using System.IO;
  9. using System.Linq;
  10. using System.Xml.Linq;
  11. using System.Xml.Serialization;
  12. using Microsoft.Xna.Framework;
  13. using Microsoft.Xna.Framework.Content;
  14. using Microsoft.Xna.Framework.Graphics;
  15. using RolePlaying.Data;
  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. private Texture2D backgroundTexture;
  24. private Vector2 backgroundPosition;
  25. private Texture2D descriptionAreaTexture;
  26. private Vector2 descriptionAreaPosition;
  27. private Vector2 descriptionAreaTextPosition;
  28. private Texture2D iconTexture;
  29. private Vector2 iconPosition;
  30. private Texture2D backTexture;
  31. private Vector2 backPosition;
  32. private Texture2D selectTexture;
  33. private Vector2 selectPosition;
  34. private Texture2D plankTexture1, plankTexture2, plankTexture3;
  35. MenuEntry newGameMenuEntry, exitGameMenuEntry;
  36. MenuEntry saveGameMenuEntry, loadGameMenuEntry;
  37. MenuEntry controlsMenuEntry, helpMenuEntry;
  38. /// <summary>
  39. /// Constructor fills in the menu contents.
  40. /// </summary>
  41. public MainMenuScreen()
  42. : base()
  43. {
  44. // add the New Game entry
  45. newGameMenuEntry = new MenuEntry("New Game");
  46. newGameMenuEntry.Description = "Start a New Game";
  47. newGameMenuEntry.Font = Fonts.HeaderFont;
  48. newGameMenuEntry.Position = new Vector2(Session.BACK_BUFFER_HEIGHT - 5, 0f);
  49. newGameMenuEntry.Angle = -3.0f;
  50. newGameMenuEntry.TextOffset = new Vector2(0f, 5.0f);
  51. newGameMenuEntry.Selected += NewGameMenuEntrySelected;
  52. MenuEntries.Add(newGameMenuEntry);
  53. // add the Save Game menu entry,
  54. // if the game has started but is not in combat
  55. if (Session.IsActive && !CombatEngine.IsActive)
  56. {
  57. saveGameMenuEntry = new MenuEntry("Save Game");
  58. saveGameMenuEntry.Description = "Save the Game";
  59. saveGameMenuEntry.Font = Fonts.HeaderFont;
  60. saveGameMenuEntry.Position = new Vector2(Session.BACK_BUFFER_HEIGHT + 10, 0f);
  61. saveGameMenuEntry.Selected += SaveGameMenuEntrySelected;
  62. MenuEntries.Add(saveGameMenuEntry);
  63. }
  64. else
  65. {
  66. saveGameMenuEntry = null;
  67. }
  68. // add the Load Game menu entry
  69. loadGameMenuEntry = new MenuEntry("Load Game");
  70. loadGameMenuEntry.Description = "Load the Game";
  71. loadGameMenuEntry.Font = Fonts.HeaderFont;
  72. loadGameMenuEntry.Position = new Vector2(Session.BACK_BUFFER_HEIGHT - 20, 0f);
  73. loadGameMenuEntry.Selected += LoadGameMenuEntrySelected;
  74. MenuEntries.Add(loadGameMenuEntry);
  75. // add the Controls menu entry
  76. controlsMenuEntry = new MenuEntry("Controls");
  77. controlsMenuEntry.Description = "View Game Controls";
  78. controlsMenuEntry.Font = Fonts.HeaderFont;
  79. controlsMenuEntry.Position = new Vector2(Session.BACK_BUFFER_HEIGHT, 0f);
  80. controlsMenuEntry.Angle = 5.0f;
  81. controlsMenuEntry.TextOffset = new Vector2(0f, -15.0f);
  82. controlsMenuEntry.Selected += ControlsMenuEntrySelected;
  83. MenuEntries.Add(controlsMenuEntry);
  84. // add the Backstory menu entry
  85. helpMenuEntry = new MenuEntry("Backstory");
  86. helpMenuEntry.Description = "View Game Backstory";
  87. helpMenuEntry.Font = Fonts.HeaderFont;
  88. helpMenuEntry.Position = new Vector2(Session.BACK_BUFFER_HEIGHT - 20, 0f);
  89. helpMenuEntry.Angle = -4.0f;
  90. helpMenuEntry.TextOffset = new Vector2(0f, 5.0f);
  91. helpMenuEntry.Selected += HelpMenuEntrySelected;
  92. MenuEntries.Add(helpMenuEntry);
  93. // create the Exit menu entry
  94. exitGameMenuEntry = new MenuEntry("Exit");
  95. exitGameMenuEntry.Description = "Quit the Game";
  96. exitGameMenuEntry.Font = Fonts.HeaderFont;
  97. exitGameMenuEntry.Position = new Vector2(Session.BACK_BUFFER_HEIGHT, 0f);
  98. exitGameMenuEntry.Selected += OnCancel;
  99. MenuEntries.Add(exitGameMenuEntry);
  100. // start the menu music
  101. AudioManager.PushMusic("MainTheme");
  102. }
  103. /// <summary>
  104. /// Load the graphics content for this screen.
  105. /// </summary>
  106. public override void LoadContent()
  107. {
  108. // load the textures
  109. ContentManager content = ScreenManager.Game.Content;
  110. backgroundTexture = content.Load<Texture2D>(Path.Combine("Textures", "MainMenu", "MainMenu"));
  111. descriptionAreaTexture =
  112. content.Load<Texture2D>(Path.Combine("Textures", "MainMenu", "MainMenuInfoSpace"));
  113. iconTexture = content.Load<Texture2D>(Path.Combine("Textures", "MainMenu", "GameLogo"));
  114. plankTexture1 =
  115. content.Load<Texture2D>(Path.Combine("Textures", "MainMenu", "MainMenuPlank"));
  116. plankTexture2 =
  117. content.Load<Texture2D>(Path.Combine("Textures", "MainMenu", "MainMenuPlank02"));
  118. plankTexture3 =
  119. content.Load<Texture2D>(Path.Combine("Textures", "MainMenu", "MainMenuPlank03"));
  120. backTexture = content.Load<Texture2D>(Path.Combine("Textures", "Buttons", "BButton"));
  121. selectTexture = content.Load<Texture2D>(Path.Combine("Textures", "Buttons", "AButton"));
  122. // calculate the texture positions
  123. backgroundPosition = new Vector2(
  124. (Session.BACK_BUFFER_WIDTH - backgroundTexture.Width) / 2,
  125. (Session.BACK_BUFFER_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. /// <summary>
  152. /// Handles user input.
  153. /// </summary>
  154. public override void HandleInput()
  155. {
  156. if (InputManager.IsActionTriggered(InputManager.InputAction.Back) &&
  157. Session.IsActive)
  158. {
  159. AudioManager.PopMusic();
  160. ExitScreen();
  161. return;
  162. }
  163. base.HandleInput();
  164. }
  165. /// <summary>
  166. /// Event handler for when the New Game menu entry is selected.
  167. /// </summary>
  168. void NewGameMenuEntrySelected(object sender, EventArgs e)
  169. {
  170. if (Session.IsActive)
  171. {
  172. ExitScreen();
  173. }
  174. ContentManager content = ScreenManager.Game.Content;
  175. //var gameStartDescription = content.Load<GameStartDescription>("MainGameDescription");
  176. var gameStartDescription = GameStartDescription.Load("MainGameDescription");
  177. var gameplayScreen = new GameplayScreen(gameStartDescription);
  178. LoadingScreen.Load(ScreenManager, true, gameplayScreen);
  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 BackstoryScreen());
  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. /// <summary>
  255. /// Draw this screen.
  256. /// </summary>
  257. public override void Draw(GameTime gameTime)
  258. {
  259. SpriteBatch spriteBatch = ScreenManager.SpriteBatch;
  260. spriteBatch.Begin(SpriteSortMode.Deferred, null, null, null, null, null, ScreenManager.GlobalTransformation);
  261. // draw the background images
  262. spriteBatch.Draw(backgroundTexture, backgroundPosition, Color.White);
  263. spriteBatch.Draw(descriptionAreaTexture, descriptionAreaPosition,
  264. Color.White);
  265. spriteBatch.Draw(iconTexture, iconPosition, Color.White);
  266. // Draw each menu entry in turn.
  267. for (int i = 0; i < MenuEntries.Count; i++)
  268. {
  269. MenuEntry menuEntry = MenuEntries[i];
  270. bool isSelected = IsActive && (i == selectedEntry);
  271. menuEntry.Draw(this, isSelected, gameTime);
  272. }
  273. // draw the description text for the selected entry
  274. MenuEntry selectedMenuEntry = SelectedMenuEntry;
  275. if ((selectedMenuEntry != null) &&
  276. !String.IsNullOrEmpty(selectedMenuEntry.Description))
  277. {
  278. Vector2 textSize =
  279. Fonts.DescriptionFont.MeasureString(selectedMenuEntry.Description);
  280. Vector2 textPosition = descriptionAreaTextPosition + new Vector2(
  281. (float)Math.Floor((descriptionAreaTexture.Width - textSize.X) / 2),
  282. 0f);
  283. spriteBatch.DrawString(Fonts.DescriptionFont,
  284. selectedMenuEntry.Description, textPosition, Color.White);
  285. }
  286. // draw the select instruction
  287. spriteBatch.Draw(selectTexture, selectPosition, Color.White);
  288. spriteBatch.DrawString(Fonts.ButtonNamesFont, "Select",
  289. new Vector2(
  290. selectPosition.X - Fonts.ButtonNamesFont.MeasureString("Select").X - 5,
  291. selectPosition.Y + 5), Color.White);
  292. // if we are in-game, draw the back instruction
  293. if (Session.IsActive)
  294. {
  295. spriteBatch.Draw(backTexture, backPosition, Color.White);
  296. spriteBatch.DrawString(Fonts.ButtonNamesFont, "Resume",
  297. new Vector2(backPosition.X + 55, backPosition.Y + 5), Color.White);
  298. }
  299. spriteBatch.End();
  300. }
  301. }
  302. }