#region File Description
//-----------------------------------------------------------------------------
// ControlsScreen.cs
//
// Microsoft XNA Community Game Platform
// Copyright (C) Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------------------------
#endregion
#region Using Statements
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Content;
using RolePlayingGameData;
#endregion
namespace RolePlaying
{
///
/// Displays the in-game controls to the user.
///
/// One possible extension would be to enable control remapping.
class ControlsScreen : GameScreen
{
#region Private Types
///
/// Holds the GamePad control info to display
///
private struct GamePadInfo
{
public string text;
public Vector2 textPosition;
}
///
/// Holds the Keyboard control info to display
///
private struct KeyboardInfo
{
public InputManager.ActionMap[] totalActionList;
public int selectedIndex;
}
#endregion
#region Graphics Data
private Texture2D backgroundTexture;
private Texture2D plankTexture;
private Vector2 plankPosition;
private Vector2 titlePosition;
private Vector2 actionPosition;
private Vector2 key1Position;
private Vector2 key2Position;
private Texture2D baseBorderTexture;
private Vector2 baseBorderPosition = new Vector2(200, 570);
private Texture2D scrollUpTexture;
private Texture2D scrollDownTexture;
private Vector2 scrollUpPosition = new Vector2(990, 235);
private Vector2 scrollDownPosition = new Vector2(990, 490);
private Texture2D rightTriggerButton;
private Texture2D leftTriggerButton;
private Vector2 rightTriggerPosition;
private Vector2 leftTriggerPosition;
private Texture2D controlPadTexture;
private Vector2 controlPosition = new Vector2(450, 180);
private Texture2D keyboardTexture;
private Vector2 keyboardPosition = new Vector2(305, 185);
private float chartLine1Position;
private float chartLine2Position;
private float chartLine3Position;
private float chartLine4Position;
private Texture2D backTexture;
private readonly Vector2 backPosition = new Vector2(225, 610);
#endregion
#region Control Display Data
private bool isShowControlPad;
private GamePadInfo[] leftStrings = new GamePadInfo[7];
private GamePadInfo[] rightStrings = new GamePadInfo[6];
private KeyboardInfo keyboardInfo;
private int startIndex = 0;
private const int maxActionDisplay = 6;
#endregion
#region Initialization
///
/// Creates a new ControlsScreen object.
///
public ControlsScreen()
: base()
{
TransitionOnTime = TimeSpan.FromSeconds(0.5);
chartLine1Position = keyboardPosition.X + 30;
chartLine2Position = keyboardPosition.X + 340;
chartLine3Position = keyboardPosition.X + 510;
chartLine4Position = keyboardPosition.X + 670;
isShowControlPad = true;
}
///
/// Loads the graphics content required for this screen.
///
public override void LoadContent()
{
Viewport viewport = ScreenManager.GraphicsDevice.Viewport;
keyboardInfo.totalActionList = InputManager.ActionMaps;
keyboardInfo.selectedIndex = 0;
const int leftStringsPosition = 450;
const int rightStringPosition = 818;
float height = Fonts.DescriptionFont.LineSpacing - 5;
// Set the data for gamepad control to display
leftStrings[0].text = "Page Left";
leftStrings[0].textPosition = new Vector2(leftStringsPosition -
Fonts.DescriptionFont.MeasureString(leftStrings[0].text).X, 170);
leftStrings[1].text = "N/A";
leftStrings[1].textPosition = new Vector2(leftStringsPosition -
Fonts.DescriptionFont.MeasureString(leftStrings[1].text).X, 220);
leftStrings[2].text = "Main Menu";
leftStrings[2].textPosition = new Vector2(leftStringsPosition -
Fonts.DescriptionFont.MeasureString(leftStrings[2].text).X, 290);
leftStrings[3].text = "Exit Game";
leftStrings[3].textPosition = new Vector2(leftStringsPosition -
Fonts.DescriptionFont.MeasureString(leftStrings[3].text).X, 340);
leftStrings[4].text = "Navigation";
leftStrings[4].textPosition = new Vector2(leftStringsPosition -
Fonts.DescriptionFont.MeasureString(leftStrings[4].text).X, 400);
leftStrings[5].text = "Navigation";
leftStrings[5].textPosition = new Vector2(leftStringsPosition -
Fonts.DescriptionFont.MeasureString(leftStrings[5].text).X, 455);
leftStrings[6].text = "N/A";
leftStrings[6].textPosition = new Vector2(leftStringsPosition -
Fonts.DescriptionFont.MeasureString(leftStrings[6].text).X, 510);
rightStrings[0].text = "Page Right";
rightStrings[0].textPosition = new Vector2(rightStringPosition, 170);
rightStrings[1].text = "N/A";
rightStrings[1].textPosition = new Vector2(rightStringPosition, 230);
rightStrings[2].text = "Character Management";
rightStrings[2].textPosition = new Vector2(rightStringPosition, 295);
rightStrings[3].text = "Back";
rightStrings[3].textPosition = new Vector2(rightStringPosition, 355);
rightStrings[4].text = "OK";
rightStrings[4].textPosition = new Vector2(rightStringPosition, 435);
rightStrings[5].text = "Drop Gear";
rightStrings[5].textPosition = new Vector2(rightStringPosition, 510);
ContentManager content = ScreenManager.Game.Content;
backgroundTexture =
content.Load(@"Textures\MainMenu\MainMenu");
keyboardTexture =
content.Load(@"Textures\MainMenu\KeyboardBkgd");
plankTexture =
content.Load(@"Textures\MainMenu\MainMenuPlank03");
backTexture =
content.Load(@"Textures\Buttons\BButton");
baseBorderTexture =
content.Load(@"Textures\GameScreens\LineBorder");
controlPadTexture =
content.Load(@"Textures\MainMenu\ControlJoystick");
scrollUpTexture =
content.Load(@"Textures\GameScreens\ScrollUp");
scrollDownTexture =
content.Load(@"Textures\GameScreens\ScrollDown");
rightTriggerButton =
content.Load(@"Textures\Buttons\RightTriggerButton");
leftTriggerButton =
content.Load(@"Textures\Buttons\LeftTriggerButton");
plankPosition.X = backgroundTexture.Width / 2 - plankTexture.Width / 2;
plankPosition.Y = 60;
rightTriggerPosition.X = 900;
rightTriggerPosition.Y = 50;
leftTriggerPosition.X = 320;
leftTriggerPosition.Y = 50;
base.LoadContent();
}
#endregion
#region Updating
///
/// Handles user input.
///
public override void HandleInput()
{
// exit the screen
if (InputManager.IsActionTriggered(InputManager.Action.Back))
{
ExitScreen();
}
#if !XBOX
// toggle between keyboard and gamepad controls
else if (InputManager.IsActionTriggered(InputManager.Action.PageLeft) ||
InputManager.IsActionTriggered(InputManager.Action.PageRight))
{
isShowControlPad = !isShowControlPad;
}
// scroll through the keyboard controls
if (isShowControlPad == false)
{
if (InputManager.IsActionTriggered(InputManager.Action.CursorDown))
{
if (startIndex < keyboardInfo.totalActionList.Length -
maxActionDisplay)
{
startIndex++;
keyboardInfo.selectedIndex++;
}
}
if (InputManager.IsActionTriggered(InputManager.Action.CursorUp))
{
if (startIndex > 0)
{
startIndex--;
keyboardInfo.selectedIndex--;
}
}
}
#endif
}
#endregion
#region Drawing
///
/// Draws the control screen
///
/// Provides a snapshot of timing values
public override void Draw(GameTime gameTime)
{
SpriteBatch spriteBatch = ScreenManager.SpriteBatch;
Vector2 textPosition = Vector2.Zero;
spriteBatch.Begin();
// Draw the background texture
spriteBatch.Draw(backgroundTexture, Vector2.Zero, Color.White);
// Draw the back icon and text
spriteBatch.Draw(backTexture, backPosition, Color.White);
spriteBatch.DrawString(Fonts.ButtonNamesFont, "Back",
new Vector2(backPosition.X + 55, backPosition.Y + 5), Color.White);
// Draw the plank
spriteBatch.Draw(plankTexture, plankPosition, Color.White);
#if !XBOX
// Draw the trigger buttons
spriteBatch.Draw(leftTriggerButton, leftTriggerPosition, Color.White);
spriteBatch.Draw(rightTriggerButton, rightTriggerPosition, Color.White);
#endif
// Draw the base border
spriteBatch.Draw(baseBorderTexture, baseBorderPosition, Color.White);
// draw the control pad screen
if (isShowControlPad)
{
spriteBatch.Draw(controlPadTexture, controlPosition,
Color.White);
for (int i = 0; i < leftStrings.Length; i++)
{
spriteBatch.DrawString(Fonts.DescriptionFont, leftStrings[i].text,
leftStrings[i].textPosition, Color.Black);
}
for (int i = 0; i < rightStrings.Length; i++)
{
spriteBatch.DrawString(Fonts.DescriptionFont, rightStrings[i].text,
rightStrings[i].textPosition, Color.Black);
}
#if !XBOX
// Near left trigger
spriteBatch.DrawString(Fonts.PlayerStatisticsFont, "Keyboard",
new Vector2(leftTriggerPosition.X + (leftTriggerButton.Width -
Fonts.PlayerStatisticsFont.MeasureString("Keyboard").X) / 2,
rightTriggerPosition.Y + 85),
Color.Black);
// Near right trigger
spriteBatch.DrawString(Fonts.PlayerStatisticsFont, "Keyboard",
new Vector2(rightTriggerPosition.X + (rightTriggerButton.Width -
Fonts.PlayerStatisticsFont.MeasureString("Keyboard").X) / 2,
rightTriggerPosition.Y + 85),
Color.Black);
#endif
// Draw the title text
titlePosition.X = plankPosition.X + (plankTexture.Width -
Fonts.HeaderFont.MeasureString("Gamepad").X) / 2;
titlePosition.Y = plankPosition.Y + (plankTexture.Height -
Fonts.HeaderFont.MeasureString("Gamepad").Y) / 2;
spriteBatch.DrawString(Fonts.HeaderFont, "Gamepad", titlePosition,
Fonts.TitleColor);
}
else // draws the keyboard screen
{
const float spacing = 47;
string keyboardString;
spriteBatch.Draw(keyboardTexture, keyboardPosition, Color.White);
for (int j = 0, i = startIndex; i < startIndex + maxActionDisplay;
i++, j++)
{
keyboardString = InputManager.GetActionName((InputManager.Action)i);
textPosition.X = chartLine1Position +
((chartLine2Position - chartLine1Position) -
Fonts.DescriptionFont.MeasureString(keyboardString).X) / 2;
textPosition.Y = 253 + (spacing * j);
// Draw the action
spriteBatch.DrawString(Fonts.DescriptionFont, keyboardString,
textPosition, Color.Black);
// Draw the key one
keyboardString =
keyboardInfo.totalActionList[i].keyboardKeys[0].ToString();
textPosition.X = chartLine2Position +
((chartLine3Position - chartLine2Position) -
Fonts.DescriptionFont.MeasureString(keyboardString).X) / 2;
spriteBatch.DrawString(Fonts.DescriptionFont, keyboardString,
textPosition, Color.Black);
// Draw the key two
if (keyboardInfo.totalActionList[i].keyboardKeys.Count > 1)
{
keyboardString = keyboardInfo.totalActionList[i].
keyboardKeys[1].ToString();
textPosition.X = chartLine3Position +
((chartLine4Position - chartLine3Position) -
Fonts.DescriptionFont.MeasureString(keyboardString).X) / 2;
spriteBatch.DrawString(Fonts.DescriptionFont, keyboardString,
textPosition, Color.Black);
}
else
{
textPosition.X = chartLine3Position +
((chartLine4Position - chartLine3Position) -
Fonts.DescriptionFont.MeasureString("---").X) / 2;
spriteBatch.DrawString(Fonts.DescriptionFont, "---",
textPosition, Color.Black);
}
}
// Draw the Action
actionPosition.X = chartLine1Position +
((chartLine2Position - chartLine1Position) -
Fonts.CaptionFont.MeasureString("Action").X) / 2;
actionPosition.Y = 200;
spriteBatch.DrawString(Fonts.CaptionFont, "Action", actionPosition,
Fonts.CaptionColor);
// Draw the Key 1
key1Position.X = chartLine2Position +
((chartLine3Position - chartLine2Position) -
Fonts.CaptionFont.MeasureString("Key 1").X) / 2;
key1Position.Y = 200;
spriteBatch.DrawString(Fonts.CaptionFont, "Key 1", key1Position,
Fonts.CaptionColor);
// Draw the Key 2
key2Position.X = chartLine3Position +
((chartLine4Position - chartLine3Position) -
Fonts.CaptionFont.MeasureString("Key 2").X) / 2;
key2Position.Y = 200;
spriteBatch.DrawString(Fonts.CaptionFont, "Key 2", key2Position,
Fonts.CaptionColor);
// Near left trigger
spriteBatch.DrawString(Fonts.PlayerStatisticsFont, "Gamepad",
new Vector2(leftTriggerPosition.X + (leftTriggerButton.Width -
Fonts.PlayerStatisticsFont.MeasureString("Gamepad").X) / 2,
rightTriggerPosition.Y + 85), Color.Black);
// Near right trigger
spriteBatch.DrawString(Fonts.PlayerStatisticsFont, "Gamepad",
new Vector2(rightTriggerPosition.X + (rightTriggerButton.Width -
Fonts.PlayerStatisticsFont.MeasureString("Gamepad").X) / 2,
rightTriggerPosition.Y + 85), Color.Black);
// Draw the title text
titlePosition.X = plankPosition.X + (plankTexture.Width -
Fonts.HeaderFont.MeasureString("Keyboard").X) / 2;
titlePosition.Y = plankPosition.Y + (plankTexture.Height -
Fonts.HeaderFont.MeasureString("Keyboard").Y) / 2;
spriteBatch.DrawString(Fonts.HeaderFont, "Keyboard", titlePosition,
Fonts.TitleColor);
// Draw the scroll textures
spriteBatch.Draw(scrollUpTexture, scrollUpPosition, Color.White);
spriteBatch.Draw(scrollDownTexture, scrollDownPosition, Color.White);
}
spriteBatch.End();
}
#endregion
}
}