//-----------------------------------------------------------------------------
// MenuEntry.cs
//
// XNA Community Game Platform
// Copyright (C) Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------------------------
using System;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Blackjack;
using CardsFramework;
using Microsoft.Xna.Framework.Net;
namespace GameStateManagement
{
///
/// MenuEntry subclass for displaying AvailableNetworkSession info.
///
class AvailableSessionMenuEntry : MenuEntry
{
public AvailableNetworkSession AvailableSession { get; }
public AvailableSessionMenuEntry(AvailableNetworkSession session)
: base(GetMenuItemText(session))
{
AvailableSession = session;
}
static string GetMenuItemText(AvailableNetworkSession session)
{
int totalSlots = session.CurrentGamerCount + session.OpenPublicGamerSlots;
return $"{session.HostGamertag} ({session.CurrentGamerCount}/{totalSlots})";
}
}
///
/// 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
{
///
/// 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;
Rectangle destination;
///
/// Gets or sets the text of this menu entry.
///
public string Text
{
get { return text; }
set { text = value; }
}
///
/// Gets or sets the position at which to draw this menu entry.
///
public Rectangle Destination
{
get { return destination; }
set { destination = value; }
}
public float Scale { get; set; }
public float Rotation { get; set; }
///
/// Optional tag for storing custom data (e.g., session reference).
///
public object Tag { get; set; }
///
/// 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));
}
///
/// Constructs a new menu entry with the specified text.
///
public MenuEntry(string text)
{
this.text = text;
Scale = 1f;
Rotation = 0f;
}
///
/// Updates the menu entry.
///
public virtual void Update(MenuScreen screen, bool isSelected, GameTime gameTime)
{
// there is no such thing as a selected item on Windows Phone, so we always
// force isSelected to be false
if (UIUtility.IsMobile)
{
isSelected = false;
}
// 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, bool isSelected, GameTime gameTime)
{
Color textColor = isSelected ? Color.White : Color.Black;
// Check if this menu entry is currently being pressed
bool isPressed = screen.IsMouseDown && isSelected;
if (UIUtility.IsMobile)
{
// there is no such thing as a selected item on Windows Phone, so we always
// force isSelected to be false
isSelected = false;
isPressed = false;
textColor = Color.Black;
}
// Draw text, centered on the middle of each line.
ScreenManager screenManager = screen.ScreenManager;
SpriteBatch spriteBatch = screenManager.SpriteBatch;
SpriteFont font = screenManager.Font;
// Use pressed texture when button is being pressed, otherwise use regular texture
Texture2D buttonTexture = isPressed ? screenManager.ButtonPressed : screenManager.ButtonBackground;
spriteBatch.Draw(buttonTexture, destination, Color.White);
spriteBatch.DrawString(screenManager.Font, text, getTextPosition(screen),
textColor, Rotation, Vector2.Zero, Scale, SpriteEffects.None, 0);
}
///
/// Queries how much space this menu entry requires.
///
public virtual int GetHeight(MenuScreen screen)
{
return screen.ScreenManager.Font.LineSpacing;
}
///
/// Queries how wide the entry is, used for centering on the screen.
///
public virtual int GetWidth(MenuScreen screen)
{
return (int)screen.ScreenManager.Font.MeasureString(Text).X;
}
private Vector2 getTextPosition(MenuScreen screen)
{
Vector2 textPosition = Vector2.Zero;
// Calculate horizontal centering
float centeredX = destination.X + (destination.Width / 2.0f) - (GetWidth(screen) / 2.0f) * Scale;
// Calculate vertical centering
float centeredY = destination.Y + (destination.Height / 2.0f) - (GetHeight(screen) / 2.0f) * Scale;
textPosition = new Vector2(centeredX, centeredY);
return textPosition;
}
}
}