MainMenuScreen.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362
  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(Session.BACK_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(Session.BACK_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(Session.BACK_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(Session.BACK_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(Session.BACK_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(Session.BACK_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. backgroundPosition = new Vector2(
  123. (Session.BACK_BUFFER_WIDTH - backgroundTexture.Width) / 2,
  124. (Session.BACK_BUFFER_HEIGHT - backgroundTexture.Height) / 2);
  125. descriptionAreaPosition = backgroundPosition + new Vector2(158, 130);
  126. descriptionAreaTextPosition = backgroundPosition + new Vector2(158, 350);
  127. iconPosition = backgroundPosition + new Vector2(170, 80);
  128. backPosition = backgroundPosition + new Vector2(225, 610);
  129. selectPosition = backgroundPosition + new Vector2(1120, 610);
  130. // set the textures on each menu entry
  131. newGameMenuEntry.Texture = plankTexture3;
  132. if (saveGameMenuEntry != null)
  133. {
  134. saveGameMenuEntry.Texture = plankTexture2;
  135. }
  136. loadGameMenuEntry.Texture = plankTexture1;
  137. controlsMenuEntry.Texture = plankTexture2;
  138. helpMenuEntry.Texture = plankTexture3;
  139. exitGameMenuEntry.Texture = plankTexture1;
  140. // now that they have textures, set the proper positions on the menu entries
  141. for (int i = 0; i < MenuEntries.Count; i++)
  142. {
  143. MenuEntries[i].Position = new Vector2(
  144. MenuEntries[i].Position.X,
  145. 500f - ((MenuEntries[i].Texture.Height - 10) *
  146. (MenuEntries.Count - 1 - i)));
  147. }
  148. base.LoadContent();
  149. }
  150. /// <summary>
  151. /// Handles user input.
  152. /// </summary>
  153. public override void HandleInput()
  154. {
  155. if (InputManager.IsActionTriggered(InputManager.Action.Back) &&
  156. Session.IsActive)
  157. {
  158. AudioManager.PopMusic();
  159. ExitScreen();
  160. return;
  161. }
  162. base.HandleInput();
  163. }
  164. /// <summary>
  165. /// Event handler for when the New Game menu entry is selected.
  166. /// </summary>
  167. void NewGameMenuEntrySelected(object sender, EventArgs e)
  168. {
  169. if (Session.IsActive)
  170. {
  171. ExitScreen();
  172. }
  173. ContentManager content = ScreenManager.Game.Content;
  174. //var gameStartDescription = content.Load<GameStartDescription>("MainGameDescription");
  175. var gameStartDescription = GameStartDescription.Load("MainGameDescription");
  176. var gameplayScreen = new GameplayScreen(gameStartDescription);
  177. LoadingScreen.Load(ScreenManager, true, gameplayScreen);
  178. }
  179. /// <summary>
  180. /// Event handler for when the Save Game menu entry is selected.
  181. /// </summary>
  182. void SaveGameMenuEntrySelected(object sender, EventArgs e)
  183. {
  184. ScreenManager.AddScreen(
  185. new SaveLoadScreen(SaveLoadScreen.SaveLoadScreenMode.Save));
  186. }
  187. /// <summary>
  188. /// Event handler for when the Load Game menu entry is selected.
  189. /// </summary>
  190. void LoadGameMenuEntrySelected(object sender, EventArgs e)
  191. {
  192. SaveLoadScreen loadGameScreen =
  193. new SaveLoadScreen(SaveLoadScreen.SaveLoadScreenMode.Load);
  194. loadGameScreen.LoadingSaveGame += new SaveLoadScreen.LoadingSaveGameHandler(
  195. loadGameScreen_LoadingSaveGame);
  196. ScreenManager.AddScreen(loadGameScreen);
  197. }
  198. /// <summary>
  199. /// Handle save-game-to-load-selected events from the SaveLoadScreen.
  200. /// </summary>
  201. void loadGameScreen_LoadingSaveGame(SaveGameDescription saveGameDescription)
  202. {
  203. if (Session.IsActive)
  204. {
  205. ExitScreen();
  206. }
  207. LoadingScreen.Load(ScreenManager, true,
  208. new GameplayScreen(saveGameDescription));
  209. }
  210. /// <summary>
  211. /// Event handler for when the Controls menu entry is selected.
  212. /// </summary>
  213. void ControlsMenuEntrySelected(object sender, EventArgs e)
  214. {
  215. ScreenManager.AddScreen(new ControlsScreen());
  216. }
  217. /// <summary>
  218. /// Event handler for when the Help menu entry is selected.
  219. /// </summary>
  220. void HelpMenuEntrySelected(object sender, EventArgs e)
  221. {
  222. ScreenManager.AddScreen(new BackstoryScreen());
  223. }
  224. /// <summary>
  225. /// When the user cancels the main menu,
  226. /// or when the Exit Game menu entry is selected.
  227. /// </summary>
  228. protected override void OnCancel()
  229. {
  230. // add a confirmation message box
  231. string message = String.Empty;
  232. if (Session.IsActive)
  233. {
  234. message =
  235. "Are you sure you want to exit? All unsaved progress will be lost.";
  236. }
  237. else
  238. {
  239. message = "Are you sure you want to exit?";
  240. }
  241. MessageBoxScreen confirmExitMessageBox = new MessageBoxScreen(message);
  242. confirmExitMessageBox.Accepted += ConfirmExitMessageBoxAccepted;
  243. ScreenManager.AddScreen(confirmExitMessageBox);
  244. }
  245. /// <summary>
  246. /// Event handler for when the user selects Yes
  247. /// on the "Are you sure?" message box.
  248. /// </summary>
  249. void ConfirmExitMessageBoxAccepted(object sender, EventArgs e)
  250. {
  251. ScreenManager.Game.Exit();
  252. }
  253. /// <summary>
  254. /// Draw this screen.
  255. /// </summary>
  256. public override void Draw(GameTime gameTime)
  257. {
  258. SpriteBatch spriteBatch = ScreenManager.SpriteBatch;
  259. spriteBatch.Begin(SpriteSortMode.Deferred, null, null, null, null, null, ScreenManager.GlobalTransformation);
  260. // draw the background images
  261. spriteBatch.Draw(backgroundTexture, backgroundPosition, Color.White);
  262. spriteBatch.Draw(descriptionAreaTexture, descriptionAreaPosition,
  263. Color.White);
  264. spriteBatch.Draw(iconTexture, iconPosition, Color.White);
  265. // Draw each menu entry in turn.
  266. for (int i = 0; i < MenuEntries.Count; i++)
  267. {
  268. MenuEntry menuEntry = MenuEntries[i];
  269. bool isSelected = IsActive && (i == selectedEntry);
  270. menuEntry.Draw(this, isSelected, gameTime);
  271. }
  272. // draw the description text for the selected entry
  273. MenuEntry selectedMenuEntry = SelectedMenuEntry;
  274. if ((selectedMenuEntry != null) &&
  275. !String.IsNullOrEmpty(selectedMenuEntry.Description))
  276. {
  277. Vector2 textSize =
  278. Fonts.DescriptionFont.MeasureString(selectedMenuEntry.Description);
  279. Vector2 textPosition = descriptionAreaTextPosition + new Vector2(
  280. (float)Math.Floor((descriptionAreaTexture.Width - textSize.X) / 2),
  281. 0f);
  282. spriteBatch.DrawString(Fonts.DescriptionFont,
  283. selectedMenuEntry.Description, textPosition, Color.White);
  284. }
  285. // draw the select instruction
  286. spriteBatch.Draw(selectTexture, selectPosition, Color.White);
  287. spriteBatch.DrawString(Fonts.ButtonNamesFont, "Select",
  288. new Vector2(
  289. selectPosition.X - Fonts.ButtonNamesFont.MeasureString("Select").X - 5,
  290. selectPosition.Y + 5), Color.White);
  291. // if we are in-game, draw the back instruction
  292. if (Session.IsActive)
  293. {
  294. spriteBatch.Draw(backTexture, backPosition, Color.White);
  295. spriteBatch.DrawString(Fonts.ButtonNamesFont, "Resume",
  296. new Vector2(backPosition.X + 55, backPosition.Y + 5), Color.White);
  297. }
  298. spriteBatch.End();
  299. }
  300. }
  301. }