#region File Description
//-----------------------------------------------------------------------------
// MenuEntry.cs
//
// XNA Community Game Platform
// Copyright (C) Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------------------------
#endregion
#region Using Statements
using System;
#if IPHONE
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
#else
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
#endif
#endregion
namespace Microsoft.Xna.Samples.GameStateManagement
{
///
/// Helper class represents a single entry in a MenuScreen. By default this
/// just draws the entry text string, but it can be customized to display menu
/// entries in different ways. This also provides an event that will be raised
/// when the menu entry is selected.
///
class MenuEntry
{
#region Fields
///
/// The text rendered for this entry.
///
string text;
///
/// Tracks a fading selection effect on the entry.
///
///
/// The entries transition out of the selection effect when they are deselected.
///
float selectionFade;
#endregion
#region Properties
///
/// Gets or sets the text of this menu entry.
///
public string Text
{
get { return text; }
set { text = value; }
}
#endregion
#region Events
///
/// Event raised when the menu entry is selected.
///
public event EventHandler Selected;
///
/// Method for raising the Selected event.
///
protected internal virtual void OnSelectEntry(PlayerIndex playerIndex)
{
if (Selected != null)
Selected(this, new PlayerIndexEventArgs(playerIndex));
}
#endregion
#region Initialization
///
/// Constructs a new menu entry with the specified text.
///
public MenuEntry(string text)
{
this.text = text;
}
#endregion
#region Update and Draw
///
/// Updates the menu entry.
///
public virtual void Update(MenuScreen screen, bool isSelected,
GameTime gameTime)
{
// When the menu selection changes, entries gradually fade between
// their selected and deselected appearance, rather than instantly
// popping to the new state.
float fadeSpeed = (float)gameTime.ElapsedGameTime.TotalSeconds * 4;
if (isSelected)
selectionFade = Math.Min(selectionFade + fadeSpeed, 1);
else
selectionFade = Math.Max(selectionFade - fadeSpeed, 0);
}
///
/// Draws the menu entry. This can be overridden to customize the appearance.
///
public virtual void Draw(MenuScreen screen, Vector2 position,
bool isSelected, GameTime gameTime)
{
// Draw the selected entry in yellow, otherwise white.
Color color = isSelected ? Color.Yellow : Color.White;
// Pulsate the size of the selected menu entry.
double time = gameTime.TotalGameTime.TotalSeconds;
float pulsate = (float)Math.Sin(time * 6) + 1;
float scale = 1 + pulsate * 0.05f * selectionFade;
// Modify the alpha to fade text out during transitions.
color = new Color(color.R, color.G, color.B, screen.TransitionAlpha);
// Draw text, centered on the middle of each line.
ScreenManager screenManager = screen.ScreenManager;
SpriteBatch spriteBatch = screenManager.SpriteBatch;
SpriteFont font = screenManager.Font;
Vector2 origin = new Vector2(0, font.LineSpacing / 2);
spriteBatch.DrawString(font, text, position, color, 0,
origin, scale, SpriteEffects.None, 0);
}
///
/// Queries how much space this menu entry requires.
///
public virtual int GetHeight(MenuScreen screen)
{
return screen.ScreenManager.Font.LineSpacing;
}
#endregion
}
}