#region File Description //----------------------------------------------------------------------------- // MessageBoxScreen.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 Microsoft.Xna.Framework.Input; using GameStateManagement; #endregion namespace GameStateManagement { /// /// A popup message box screen, used to display "are you sure?" /// confirmation messages. /// class MessageBoxScreen : GameScreen { #region Fields string message; Texture2D gradientTexture; InputAction menuSelect; InputAction menuCancel; #endregion #region Events public event EventHandler Accepted; public event EventHandler Cancelled; #endregion #region Initialization /// /// Constructor automatically includes the standard "A=ok, B=cancel" /// usage text prompt. /// public MessageBoxScreen(string message) : this(message, true) { } /// /// Constructor lets the caller specify whether to include the standard /// "A=ok, B=cancel" usage text prompt. /// public MessageBoxScreen(string message, bool includeUsageText) { const string usageText = "\nA button, Space, Enter = ok" + "\nB button, Esc = cancel"; if (includeUsageText) this.message = message + usageText; else this.message = message; IsPopup = true; TransitionOnTime = TimeSpan.FromSeconds(0.2); TransitionOffTime = TimeSpan.FromSeconds(0.2); menuSelect = new InputAction( new Buttons[] { Buttons.A, Buttons.Start }, new Keys[] { Keys.Space, Keys.Enter }, true); menuCancel = new InputAction( new Buttons[] { Buttons.B, Buttons.Back }, new Keys[] { Keys.Escape, Keys.Back }, true); } /// /// Loads graphics content for this screen. This uses the shared ContentManager /// provided by the Game class, so the content will remain loaded forever. /// Whenever a subsequent MessageBoxScreen tries to load this same content, /// it will just get back another reference to the already loaded data. /// public override void Activate(bool instancePreserved) { if (!instancePreserved) { ContentManager content = ScreenManager.Game.Content; gradientTexture = content.Load("gradient"); } } #endregion #region Handle Input /// /// Responds to user input, accepting or cancelling the message box. /// public override void HandleInput(GameTime gameTime, InputState input) { PlayerIndex playerIndex; // We pass in our ControllingPlayer, which may either be null (to // accept input from any player) or a specific index. If we pass a null // controlling player, the InputState helper returns to us which player // actually provided the input. We pass that through to our Accepted and // Cancelled events, so they can tell which player triggered them. if (menuSelect.Evaluate(input, ControllingPlayer, out playerIndex)) { // Raise the accepted event, then exit the message box. if (Accepted != null) Accepted(this, new PlayerIndexEventArgs(playerIndex)); ExitScreen(); } else if (menuCancel.Evaluate(input, ControllingPlayer, out playerIndex)) { // Raise the cancelled event, then exit the message box. if (Cancelled != null) Cancelled(this, new PlayerIndexEventArgs(playerIndex)); ExitScreen(); } } #endregion #region Draw /// /// Draws the message box. /// public override void Draw(GameTime gameTime) { SpriteBatch spriteBatch = ScreenManager.SpriteBatch; SpriteFont font = ScreenManager.Font; // Darken down any other screens that were drawn beneath the popup. ScreenManager.FadeBackBufferToBlack(TransitionAlpha * 2 / 3); // Center the message text in the viewport. Viewport viewport = ScreenManager.GraphicsDevice.Viewport; Vector2 viewportSize = new Vector2(viewport.Width, viewport.Height); Vector2 textSize = font.MeasureString(message); Vector2 textPosition = (viewportSize - textSize) / 2; // The background includes a border somewhat larger than the text itself. const int hPad = 32; const int vPad = 16; Rectangle backgroundRectangle = new Rectangle((int)textPosition.X - hPad, (int)textPosition.Y - vPad, (int)textSize.X + hPad * 2, (int)textSize.Y + vPad * 2); // Fade the popup alpha during transitions. Color color = Color.White * TransitionAlpha; spriteBatch.Begin(); // Draw the background rectangle. spriteBatch.Draw(gradientTexture, backgroundRectangle, color); // Draw the message box text. spriteBatch.DrawString(font, message, textPosition, color); spriteBatch.End(); } #endregion } }