#region File Description
//-----------------------------------------------------------------------------
// GamePadHelper.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.Input;
using Microsoft.Xna.Framework;
using System.Diagnostics;
#endregion
namespace Spacewar
{
///
/// Useful class that wraps some game pad stuff to give you indication of single button presses
/// by remembering previous state. Right now its one shot which means if you call a Pressed function
/// that will 'remove' the press.
///
/// Keyboard support should be mapped in here based on PlayerIndex.
/// PlayerIndex.One Key mapping is (Keys for player one to use)
/// PlayerIndex.Two Key mapping is (Keys for Player two to use)
/// Players Three => Infinity are not supported on a keyboard!
///
public enum GamePadKeys
{
Start = 0,
Back,
A,
B,
X,
Y,
Up,
Down,
Left,
Right,
LeftTrigger,
RightTrigger,
ThumbstickLeftXMin,
ThumbstickLeftXMax,
ThumbstickLeftYMin,
ThumbstickLeftYMax,
ThumbstickRightXMin,
ThumbstickRightXMax,
ThumbstickRightYMin,
ThumbstickRightYMax
};
public class GamePadHelper
{
private PlayerIndex player;
private Keymap keyMapping = new Keymap();
private KeyboardState keyState;
private Game game;
///
/// Default constructor
///
/// Which player. Not that you can't use PlayerIndex.Any with this helper
public GamePadHelper(PlayerIndex player)
{
//Need to store the player. If you try to store a reference to the GamePad here it seems to 'forget'
this.player = player;
if (player == PlayerIndex.One)
{
keyMapping.Add(GamePadKeys.Start, SpacewarGame.Settings.Player1Start);
keyMapping.Add(GamePadKeys.Back, SpacewarGame.Settings.Player1Back);
keyMapping.Add(GamePadKeys.A, SpacewarGame.Settings.Player1A);
keyMapping.Add(GamePadKeys.B, SpacewarGame.Settings.Player1B);
keyMapping.Add(GamePadKeys.X, SpacewarGame.Settings.Player1X);
keyMapping.Add(GamePadKeys.Y, SpacewarGame.Settings.Player1Y);
keyMapping.Add(GamePadKeys.Up, SpacewarGame.Settings.Player1Up);
keyMapping.Add(GamePadKeys.Down, SpacewarGame.Settings.Player1Down);
keyMapping.Add(GamePadKeys.Left, SpacewarGame.Settings.Player1Left);
keyMapping.Add(GamePadKeys.Right, SpacewarGame.Settings.Player1Right);
keyMapping.Add(GamePadKeys.LeftTrigger, SpacewarGame.Settings.Player1LeftTrigger);
keyMapping.Add(GamePadKeys.RightTrigger, SpacewarGame.Settings.Player1RightTrigger);
keyMapping.Add(GamePadKeys.ThumbstickLeftXMin, SpacewarGame.Settings.Player1ThumbstickLeftXmin);
keyMapping.Add(GamePadKeys.ThumbstickLeftXMax, SpacewarGame.Settings.Player1ThumbstickLeftXmax);
keyMapping.Add(GamePadKeys.ThumbstickLeftYMin, SpacewarGame.Settings.Player1ThumbstickLeftYmin);
keyMapping.Add(GamePadKeys.ThumbstickLeftYMax, SpacewarGame.Settings.Player1ThumbstickLeftYmax);
}
if (player == PlayerIndex.Two)
{
keyMapping.Add(GamePadKeys.Start, SpacewarGame.Settings.Player2Start);
keyMapping.Add(GamePadKeys.Back, SpacewarGame.Settings.Player2Back);
keyMapping.Add(GamePadKeys.A, SpacewarGame.Settings.Player2A);
keyMapping.Add(GamePadKeys.B, SpacewarGame.Settings.Player2B);
keyMapping.Add(GamePadKeys.X, SpacewarGame.Settings.Player2X);
keyMapping.Add(GamePadKeys.Y, SpacewarGame.Settings.Player2Y);
keyMapping.Add(GamePadKeys.Up, SpacewarGame.Settings.Player2Up);
keyMapping.Add(GamePadKeys.Down, SpacewarGame.Settings.Player2Down);
keyMapping.Add(GamePadKeys.Left, SpacewarGame.Settings.Player2Left);
keyMapping.Add(GamePadKeys.Right, SpacewarGame.Settings.Player2Right);
keyMapping.Add(GamePadKeys.LeftTrigger, SpacewarGame.Settings.Player2LeftTrigger);
keyMapping.Add(GamePadKeys.RightTrigger, SpacewarGame.Settings.Player2RightTrigger);
keyMapping.Add(GamePadKeys.ThumbstickLeftXMin, SpacewarGame.Settings.Player2ThumbstickLeftXmin);
keyMapping.Add(GamePadKeys.ThumbstickLeftXMax, SpacewarGame.Settings.Player2ThumbstickLeftXmax);
keyMapping.Add(GamePadKeys.ThumbstickLeftYMin, SpacewarGame.Settings.Player2ThumbstickLeftYmin);
keyMapping.Add(GamePadKeys.ThumbstickLeftYMax, SpacewarGame.Settings.Player2ThumbstickLeftYmax);
}
}
public GamePadState State
{
get
{
return state;
}
}
private bool AWasReleased;
private bool BWasReleased;
private bool YWasReleased;
private bool XWasReleased;
private bool StartWasReleased;
private bool BackWasReleased;
private bool UpWasReleased;
private bool DownWasReleased;
private bool LeftWasReleased;
private bool RightWasReleased;
private bool LeftTriggerWasReleased;
private bool RightTriggerWasReleased;
private bool kbAWasReleased;
private bool kbBWasReleased;
private bool kbYWasReleased;
private bool kbXWasReleased;
private bool kbStartWasReleased;
private bool kbBackWasReleased;
private bool kbUpWasReleased;
private bool kbDownWasReleased;
private bool kbLeftWasReleased;
private bool kbRightWasReleased;
private bool kbLeftTriggerWasReleased;
private bool kbRightTriggerWasReleased;
private GamePadState state;
public float ThumbStickLeftX
{
get
{
float result = 0.0f;
if (game.IsActive)
{
if (state.IsConnected)
result = state.ThumbSticks.Left.X;
if (keyState.IsKeyDown(keyMapping.Get(GamePadKeys.ThumbstickLeftXMin)))
result = -1.0f;
if (keyState.IsKeyDown(keyMapping.Get(GamePadKeys.ThumbstickLeftXMax)))
result = 1.0f;
}
return result;
}
}
public float ThumbStickLeftY
{
get
{
float result = 0.0f;
if (game.IsActive)
{
if (state.IsConnected)
result = state.ThumbSticks.Left.Y;
if (keyState.IsKeyDown(keyMapping.Get(GamePadKeys.ThumbstickLeftYMin)))
result = -1.0f;
if (keyState.IsKeyDown(keyMapping.Get(GamePadKeys.ThumbstickLeftYMax)))
result = 1.0f;
}
return result;
}
}
public float ThumbStickRightX
{
get
{
float result = 0.0f;
if (game.IsActive)
{
if (state.IsConnected)
result = state.ThumbSticks.Right.X;
if (keyState.IsKeyDown(keyMapping.Get(GamePadKeys.ThumbstickRightXMin)))
result = -1.0f;
if (keyState.IsKeyDown(keyMapping.Get(GamePadKeys.ThumbstickRightXMax)))
result = 1.0f;
}
return result;
}
}
public float ThumbStickRightY
{
get
{
float result = 0.0f;
if (game.IsActive)
{
if (state.IsConnected)
result = state.ThumbSticks.Right.Y;
if (keyState.IsKeyDown(keyMapping.Get(GamePadKeys.ThumbstickRightYMin)))
result = -1.0f;
if (keyState.IsKeyDown(keyMapping.Get(GamePadKeys.ThumbstickRightYMax)))
result = 1.0f;
}
return result;
}
}
///
/// Has the left trigger been pressed
///
public bool LeftTriggerPressed
{
get
{
return ((checkPressed(state.Triggers.Left, ref LeftTriggerWasReleased))
|| (checkPressed(keyState.IsKeyDown(keyMapping.Get(GamePadKeys.LeftTrigger)), ref kbLeftTriggerWasReleased)));
}
}
///
/// Has the right trigger been pressed
///
public bool RightTriggerPressed
{
get
{
return ((checkPressed(state.Triggers.Right, ref RightTriggerWasReleased))
|| (checkPressed(keyState.IsKeyDown(keyMapping.Get(GamePadKeys.RightTrigger)), ref kbRightTriggerWasReleased)));
}
}
///
/// Has the A button been pressed
///
public bool APressed
{
get
{
return ((checkPressed(state.Buttons.A, ref AWasReleased))
|| (checkPressed(keyState.IsKeyDown(keyMapping.Get(GamePadKeys.A)), ref kbAWasReleased)));
}
}
///
/// Has the B button been pressed
///
public bool BPressed
{
get
{
return ((checkPressed(state.Buttons.B, ref BWasReleased))
|| (checkPressed(keyState.IsKeyDown(keyMapping.Get(GamePadKeys.B)), ref kbBWasReleased)));
}
}
///
/// Has the Y button been pressed
///
public bool YPressed
{
get
{
return ((checkPressed(state.Buttons.Y, ref YWasReleased))
|| (checkPressed(keyState.IsKeyDown(keyMapping.Get(GamePadKeys.Y)), ref kbYWasReleased)));
}
}
///
/// Has the X button been pressed
///
public bool XPressed
{
get
{
return ((checkPressed(state.Buttons.X, ref XWasReleased))
|| (checkPressed(keyState.IsKeyDown(keyMapping.Get(GamePadKeys.X)), ref kbXWasReleased)));
}
}
///
/// Has the start button been pressed
///
public bool StartPressed
{
get
{
return ((checkPressed(state.Buttons.Start, ref StartWasReleased))
|| (checkPressed(keyState.IsKeyDown(keyMapping.Get(GamePadKeys.Start)), ref kbStartWasReleased)));
}
}
///
/// Has the back button been pressed
///
public bool BackPressed
{
get
{
return ((checkPressed(state.Buttons.Back, ref BackWasReleased))
|| (checkPressed(keyState.IsKeyDown(keyMapping.Get(GamePadKeys.Back)), ref kbBackWasReleased)));
}
}
///
/// Has the up dpad been pressed
///
public bool UpPressed
{
get
{
return ((checkPressed(state.DPad.Up, ref UpWasReleased))
|| (checkPressed(keyState.IsKeyDown(keyMapping.Get(GamePadKeys.Up)), ref kbUpWasReleased)));
}
}
///
/// Has the down dpad been pressed
///
public bool DownPressed
{
get
{
return ((checkPressed(state.DPad.Down, ref DownWasReleased))
|| (checkPressed(keyState.IsKeyDown(keyMapping.Get(GamePadKeys.Down)), ref kbDownWasReleased)));
}
}
///
/// Has the left dpad been pressed
///
public bool LeftPressed
{
get
{
return ((checkPressed(state.DPad.Left, ref LeftWasReleased))
|| (checkPressed(keyState.IsKeyDown(keyMapping.Get(GamePadKeys.Left)), ref kbLeftWasReleased)));
}
}
///
/// Has the right dpad been pressed
///
public bool RightPressed
{
get
{
return ((checkPressed(state.DPad.Right, ref RightWasReleased))
|| (checkPressed(keyState.IsKeyDown(keyMapping.Get(GamePadKeys.Right)), ref kbRightWasReleased)));
}
}
private bool checkPressed(ButtonState buttonState, ref bool controlWasReleased)
{
//Buttons are considered pressed when their state = Pressed
return checkPressed(buttonState == ButtonState.Pressed, ref controlWasReleased);
}
private bool checkPressed(float triggerState, ref bool controlWasReleased)
{
//Triggers are considered pressed when their value >0
return checkPressed(triggerState > 0, ref controlWasReleased);
}
private bool checkPressed(bool pressed, ref bool controlWasReleased)
{
bool returnValue = controlWasReleased && pressed;
if (game.IsActive)
{
//If the item is currently pressed then reset the 'released' indicators
if (returnValue)
{
controlWasReleased = false;
}
}
else
{
return false; // Control can never be pressed, game is not the active application!
}
return returnValue;
}
///
/// Updates the states. Should be called once per frame in the game loop otherwise the IsPressed functions
/// won't work
///
public void Update(Game game, KeyboardState keyState)
{
state = GamePad.GetState(player);
this.keyState = keyState;
this.game = game;
if (player == PlayerIndex.One)
{
//Check which buttons have been released so we can detect presses
if (keyState.IsKeyUp(SpacewarGame.Settings.Player1A)) kbAWasReleased = true;
if (keyState.IsKeyUp(SpacewarGame.Settings.Player1B)) kbBWasReleased = true;
if (keyState.IsKeyUp(SpacewarGame.Settings.Player1Y)) kbYWasReleased = true;
if (keyState.IsKeyUp(SpacewarGame.Settings.Player1X)) kbXWasReleased = true;
if (keyState.IsKeyUp(SpacewarGame.Settings.Player1Start)) kbStartWasReleased = true;
if (keyState.IsKeyUp(SpacewarGame.Settings.Player1Back)) kbBackWasReleased = true;
if (keyState.IsKeyUp(SpacewarGame.Settings.Player1Up)) kbUpWasReleased = true;
if (keyState.IsKeyUp(SpacewarGame.Settings.Player1Down)) kbDownWasReleased = true;
if (keyState.IsKeyUp(SpacewarGame.Settings.Player1Left)) kbLeftWasReleased = true;
if (keyState.IsKeyUp(SpacewarGame.Settings.Player1Right)) kbRightWasReleased = true;
if (keyState.IsKeyUp(SpacewarGame.Settings.Player1LeftTrigger)) kbLeftTriggerWasReleased = true;
if (keyState.IsKeyUp(SpacewarGame.Settings.Player1RightTrigger)) kbRightTriggerWasReleased = true;
}
else
{
//Check which buttons have been released so we can detect presses
if (keyState.IsKeyUp(SpacewarGame.Settings.Player2A)) kbAWasReleased = true;
if (keyState.IsKeyUp(SpacewarGame.Settings.Player2B)) kbBWasReleased = true;
if (keyState.IsKeyUp(SpacewarGame.Settings.Player2Y)) kbYWasReleased = true;
if (keyState.IsKeyUp(SpacewarGame.Settings.Player2X)) kbXWasReleased = true;
if (keyState.IsKeyUp(SpacewarGame.Settings.Player2Start)) kbStartWasReleased = true;
if (keyState.IsKeyUp(SpacewarGame.Settings.Player2Back)) kbBackWasReleased = true;
if (keyState.IsKeyUp(SpacewarGame.Settings.Player2Up)) kbUpWasReleased = true;
if (keyState.IsKeyUp(SpacewarGame.Settings.Player2Down)) kbDownWasReleased = true;
if (keyState.IsKeyUp(SpacewarGame.Settings.Player2Left)) kbLeftWasReleased = true;
if (keyState.IsKeyUp(SpacewarGame.Settings.Player2Right)) kbRightWasReleased = true;
if (keyState.IsKeyUp(SpacewarGame.Settings.Player2LeftTrigger)) kbLeftTriggerWasReleased = true;
if (keyState.IsKeyUp(SpacewarGame.Settings.Player2RightTrigger)) kbRightTriggerWasReleased = true;
}
if (state.IsConnected)
{
//Check which buttons have been released so we can detect presses
if (state.Buttons.A == ButtonState.Released) AWasReleased = true;
if (state.Buttons.B == ButtonState.Released) BWasReleased = true;
if (state.Buttons.Y == ButtonState.Released) YWasReleased = true;
if (state.Buttons.X == ButtonState.Released) XWasReleased = true;
if (state.Buttons.Start == ButtonState.Released) StartWasReleased = true;
if (state.Buttons.Back == ButtonState.Released) BackWasReleased = true;
if (state.DPad.Up == ButtonState.Released) UpWasReleased = true;
if (state.DPad.Down == ButtonState.Released) DownWasReleased = true;
if (state.DPad.Left == ButtonState.Released) LeftWasReleased = true;
if (state.DPad.Right == ButtonState.Released) RightWasReleased = true;
if (state.Triggers.Left == 0f) LeftTriggerWasReleased = true;
if (state.Triggers.Right == 0f) RightTriggerWasReleased = true;
}
}
}
}