MainMenuScreen.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374
  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.Linq;
  9. using System.Xml.Linq;
  10. using System.Xml.Serialization;
  11. using Microsoft.Xna.Framework;
  12. using Microsoft.Xna.Framework.Content;
  13. using Microsoft.Xna.Framework.Graphics;
  14. using RolePlaying.Data;
  15. namespace RolePlaying
  16. {
  17. /// <summary>
  18. /// The main menu screen is the first thing displayed when the game starts up.
  19. /// </summary>
  20. class MainMenuScreen : MenuScreen
  21. {
  22. private Texture2D backgroundTexture;
  23. private Vector2 backgroundPosition;
  24. private Texture2D descriptionAreaTexture;
  25. private Vector2 descriptionAreaPosition;
  26. private Vector2 descriptionAreaTextPosition;
  27. private Texture2D iconTexture;
  28. private Vector2 iconPosition;
  29. private Texture2D backTexture;
  30. private Vector2 backPosition;
  31. private Texture2D selectTexture;
  32. private Vector2 selectPosition;
  33. private Texture2D plankTexture1, plankTexture2, plankTexture3;
  34. MenuEntry newGameMenuEntry, exitGameMenuEntry;
  35. MenuEntry saveGameMenuEntry, loadGameMenuEntry;
  36. MenuEntry controlsMenuEntry, helpMenuEntry;
  37. /// <summary>
  38. /// Constructor fills in the menu contents.
  39. /// </summary>
  40. public MainMenuScreen()
  41. : base()
  42. {
  43. // add the New Game entry
  44. newGameMenuEntry = new MenuEntry("New Game");
  45. newGameMenuEntry.Description = "Start a New Game";
  46. newGameMenuEntry.Font = Fonts.HeaderFont;
  47. newGameMenuEntry.Position = new Vector2(RolePlayingGame.BUFFER_HEIGHT - 5, 0f);
  48. newGameMenuEntry.Angle = -3.0f;
  49. newGameMenuEntry.TextOffset = new Vector2(0f, 5.0f);
  50. newGameMenuEntry.Selected += NewGameMenuEntrySelected;
  51. MenuEntries.Add(newGameMenuEntry);
  52. // add the Save Game menu entry,
  53. // if the game has started but is not in combat
  54. if (Session.IsActive && !CombatEngine.IsActive)
  55. {
  56. saveGameMenuEntry = new MenuEntry("Save Game");
  57. saveGameMenuEntry.Description = "Save the Game";
  58. saveGameMenuEntry.Font = Fonts.HeaderFont;
  59. saveGameMenuEntry.Position = new Vector2(RolePlayingGame.BUFFER_HEIGHT + 10, 0f);
  60. saveGameMenuEntry.Selected += SaveGameMenuEntrySelected;
  61. MenuEntries.Add(saveGameMenuEntry);
  62. }
  63. else
  64. {
  65. saveGameMenuEntry = null;
  66. }
  67. // add the Load Game menu entry
  68. loadGameMenuEntry = new MenuEntry("Load Game");
  69. loadGameMenuEntry.Description = "Load the Game";
  70. loadGameMenuEntry.Font = Fonts.HeaderFont;
  71. loadGameMenuEntry.Position = new Vector2(RolePlayingGame.BUFFER_HEIGHT - 20, 0f);
  72. loadGameMenuEntry.Selected += LoadGameMenuEntrySelected;
  73. MenuEntries.Add(loadGameMenuEntry);
  74. // add the Controls menu entry
  75. controlsMenuEntry = new MenuEntry("Controls");
  76. controlsMenuEntry.Description = "View Game Controls";
  77. controlsMenuEntry.Font = Fonts.HeaderFont;
  78. controlsMenuEntry.Position = new Vector2(RolePlayingGame.BUFFER_HEIGHT, 0f);
  79. controlsMenuEntry.Angle = 5.0f;
  80. controlsMenuEntry.TextOffset = new Vector2(0f, -15.0f);
  81. controlsMenuEntry.Selected += ControlsMenuEntrySelected;
  82. MenuEntries.Add(controlsMenuEntry);
  83. // add the Backstory menu entry
  84. helpMenuEntry = new MenuEntry("Backstory");
  85. helpMenuEntry.Description = "View Game Backstory";
  86. helpMenuEntry.Font = Fonts.HeaderFont;
  87. helpMenuEntry.Position = new Vector2(RolePlayingGame.BUFFER_HEIGHT - 20, 0f);
  88. helpMenuEntry.Angle = -4.0f;
  89. helpMenuEntry.TextOffset = new Vector2(0f, 5.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(RolePlayingGame.BUFFER_HEIGHT, 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. /// <summary>
  152. /// Handles user input.
  153. /// </summary>
  154. public override void HandleInput()
  155. {
  156. if (InputManager.IsActionTriggered(InputManager.Action.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();
  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. }