␍␊ |
using System.Collections.Generic;␍␊ |
using Microsoft.Xna.Framework;␍␊ |
using Microsoft.Xna.Framework.Content;␍␊ |
using Microsoft.Xna.Framework.Input;␍␊ |
using Microsoft.Xna.Framework.Input.Touch;␍␊ |
using FarseerPhysics.SamplesFramework;␍␊ |
using Microsoft.Xna.Framework.Graphics;␍␊ |
␍␊ |
namespace GameStateManagement␍␊ |
{␍␊ |
␍␊ |
/// <summary>␍␊ |
/// an enum of all available mouse buttons.␍␊ |
/// </summary>␍␊ |
public enum MouseButtons␍␊ |
{␍␊ |
LeftButton,␍␊ |
MiddleButton,␍␊ |
RightButton,␍␊ |
ExtraButton1,␍␊ |
ExtraButton2␍␊ |
}␍␊ |
␍␊ |
/// <summary>␍␊ |
/// Helper for reading input from keyboard, gamepad, and touch input. This class ␍␊ |
/// tracks both the current and previous state of the input devices, and implements ␍␊ |
|
␍␊ |
␍␊ |
/*␍␊ |
* ␍␊ |
* ␍␊ |
* ␍␊ |
* ␍␊ |
* Adding variables for the cursor ␍␊ |
* -- Nathan Adams [adamsna@datanethost.net] - 4/15/2012␍␊ |
* ␍␊ |
*/␍␊ |
private MouseState _currentMouseState;␍␊ |
private MouseState _lastMouseState;␍␊ |
␍␊ |
private Vector2 _cursor;␍␊ |
private bool _cursorIsValid;␍␊ |
private bool _cursorIsVisible;␍␊ |
|
public TouchCollection TouchState;␍␊ |
␍␊ |
public readonly List<GestureSample> Gestures = new List<GestureSample>();␍␊ |
␍␊ |
private ScreenManager _manager;␍␊ |
private Viewport _viewport;␍␊ |
␍␊ |
␍␊ |
/// <summary>␍␊ |
/// Constructs a new input state.␍␊ |
/// </summary>␍␊ |
public InputState()␍␊ |
public InputState(ScreenManager manager)␍␊ |
{␍␊ |
_manager = manager;␍␊ |
CurrentKeyboardStates = new KeyboardState[MaxInputs];␍␊ |
CurrentGamePadStates = new GamePadState[MaxInputs];␍␊ |
␍␊ |
|
LastGamePadStates = new GamePadState[MaxInputs];␍␊ |
␍␊ |
GamePadWasConnected = new bool[MaxInputs];␍␊ |
_currentVirtualState = new GamePadState();␍␊ |
_lastVirtualState = new GamePadState();␍␊ |
␍␊ |
_cursorIsVisible = false;␍␊ |
_cursorMoved = false;␍␊ |
#if WINDOWS_PHONE␍␊ |
_cursorIsValid = false;␍␊ |
#else␍␊ |
_cursorIsValid = true;␍␊ |
#endif␍␊ |
_cursor = Vector2.Zero;␍␊ |
␍␊ |
_handleVirtualStick = false;␍␊ |
}␍␊ |
␍␊ |
public MouseState MouseState␍␊ |
{␍␊ |
get { return _currentMouseState; }␍␊ |
}␍␊ |
␍␊ |
public GamePadState VirtualState␍␊ |
{␍␊ |
get { return _currentVirtualState; }␍␊ |
}␍␊ |
␍␊ |
public MouseState PreviousMouseState␍␊ |
{␍␊ |
get { return _lastMouseState; }␍␊ |
}␍␊ |
␍␊ |
public GamePadState PreviousVirtualState␍␊ |
{␍␊ |
get { return _lastVirtualState; }␍␊ |
}␍␊ |
␍␊ |
public bool ShowCursor␍␊ |
{␍␊ |
get { return _cursorIsVisible && _cursorIsValid; }␍␊ |
set { _cursorIsVisible = value; }␍␊ |
}␍␊ |
␍␊ |
public bool EnableVirtualStick␍␊ |
{␍␊ |
get { return _handleVirtualStick; }␍␊ |
set { _handleVirtualStick = value; }␍␊ |
}␍␊ |
␍␊ |
public Vector2 Cursor␍␊ |
{␍␊ |
get { return _cursor; }␍␊ |
}␍␊ |
␍␊ |
public bool IsCursorMoved␍␊ |
{␍␊ |
get { return _cursorMoved; }␍␊ |
}␍␊ |
␍␊ |
public bool IsCursorValid␍␊ |
{␍␊ |
get { return _cursorIsValid; }␍␊ |
}␍␊ |
␍␊ |
public void LoadContent()␍␊ |
{␍␊ |
ContentManager man = new ContentManager(_manager.Game.Services, "Content");␍␊ |
_cursorSprite = new Sprite(man.Load<Texture2D>("Common/cursor"));␍␊ |
#if WINDOWS_PHONE␍␊ |
// virtual stick content␍␊ |
_phoneStick = new VirtualStick(man.Load<Texture2D>("Common/socket"),␍␊ |
man.Load<Texture2D>("Common/stick"), new Vector2(80f, 400f));␍␊ |
␍␊ |
Texture2D temp = man.Load<Texture2D>("Common/buttons");␍␊ |
_phoneA = new VirtualButton(temp, new Vector2(695f, 380f), new Rectangle(0, 0, 40, 40), new Rectangle(0, 40, 40, 40));␍␊ |
_phoneB = new VirtualButton(temp, new Vector2(745f, 360f), new Rectangle(40, 0, 40, 40), new Rectangle(40, 40, 40, 40));␍␊ |
#endif␍␊ |
_viewport = _manager.GraphicsDevice.Viewport;␍␊ |
}␍␊ |
␍␊ |
private GamePadState HandleVirtualStickWin()␍␊ |
{␍␊ |
Vector2 _leftStick = Vector2.Zero;␍␊ |
List<Buttons> _buttons = new List<Buttons>();␍␊ |
PlayerIndex pout;␍␊ |
if (IsNewKeyPress(Keys.A, PlayerIndex.One, out pout))␍␊ |
{␍␊ |
_leftStick.X -= 1f;␍␊ |
}␍␊ |
if (IsNewKeyPress(Keys.S, PlayerIndex.One, out pout))␍␊ |
{␍␊ |
_leftStick.Y -= 1f;␍␊ |
}␍␊ |
if (IsNewKeyPress(Keys.D, PlayerIndex.One, out pout))␍␊ |
{␍␊ |
_leftStick.X += 1f;␍␊ |
}␍␊ |
if (IsNewKeyPress(Keys.W, PlayerIndex.One, out pout))␍␊ |
{␍␊ |
_leftStick.Y += 1f;␍␊ |
}␍␊ |
if (IsNewKeyPress(Keys.Space, PlayerIndex.One, out pout))␍␊ |
{␍␊ |
_buttons.Add(Buttons.A);␍␊ |
}␍␊ |
if (IsNewKeyPress(Keys.LeftControl, PlayerIndex.One, out pout))␍␊ |
{␍␊ |
_buttons.Add(Buttons.B);␍␊ |
}␍␊ |
if (_leftStick != Vector2.Zero)␍␊ |
{␍␊ |
_leftStick.Normalize();␍␊ |
}␍␊ |
␍␊ |
return new GamePadState(_leftStick, Vector2.Zero, 0f, 0f, _buttons.ToArray());␍␊ |
}␍␊ |
␍␊ |
private GamePadState HandleVirtualStickWP7()␍␊ |
{␍␊ |
List<Buttons> _buttons = new List<Buttons>();␍␊ |
Vector2 _stick = Vector2.Zero;␍␊ |
#if WINDOWS_PHONE␍␊ |
_phoneA.Pressed = false;␍␊ |
_phoneB.Pressed = false;␍␊ |
TouchCollection touchLocations = TouchPanel.GetState();␍␊ |
foreach (TouchLocation touchLocation in touchLocations)␍␊ |
{␍␊ |
_phoneA.Update(touchLocation);␍␊ |
_phoneB.Update(touchLocation);␍␊ |
_phoneStick.Update(touchLocation);␍␊ |
}␍␊ |
if (_phoneA.Pressed)␍␊ |
{␍␊ |
_buttons.Add(Buttons.A);␍␊ |
}␍␊ |
if (_phoneB.Pressed)␍␊ |
{␍␊ |
_buttons.Add(Buttons.B);␍␊ |
}␍␊ |
_stick = _phoneStick.StickPosition;␍␊ |
#endif␍␊ |
return new GamePadState(_stick, Vector2.Zero, 0f, 0f, _buttons.ToArray());␍␊ |
}␍␊ |
␍␊ |
/// <summary>␍␊ |
|
/// </summary>␍␊ |
public void Update()␍␊ |
{␍␊ |
_lastMouseState = _currentMouseState;␍␊ |
if (_handleVirtualStick)␍␊ |
{␍␊ |
_lastVirtualState = _currentVirtualState;␍␊ |
}␍␊ |
␍␊ |
_currentMouseState = Mouse.GetState();␍␊ |
␍␊ |
if (_handleVirtualStick)␍␊ |
{␍␊ |
#if XBOX␍␊ |
_currentVirtualState= GamePad.GetState(PlayerIndex.One);␍␊ |
#elif WINDOWS␍␊ |
if (GamePad.GetState(PlayerIndex.One).IsConnected)␍␊ |
{␍␊ |
_currentVirtualState = GamePad.GetState(PlayerIndex.One);␍␊ |
}␍␊ |
else␍␊ |
{␍␊ |
_currentVirtualState = HandleVirtualStickWin();␍␊ |
}␍␊ |
#elif WINDOWS_PHONE␍␊ |
_currentVirtualState = HandleVirtualStickWP7();␍␊ |
#endif␍␊ |
}␍␊ |
for (int i = 0; i < MaxInputs; i++)␍␊ |
{␍␊ |
LastKeyboardStates[i] = CurrentKeyboardStates[i];␍␊ |
|
IsNewButtonPress(button, PlayerIndex.Four, out playerIndex));␍␊ |
}␍␊ |
}␍␊ |
␍␊ |
public bool IsNewVirtualButtonPress(Buttons button)␍␊ |
{␍␊ |
return (_lastVirtualState.IsButtonUp(button) &&␍␊ |
_currentVirtualState.IsButtonDown(button));␍␊ |
}␍␊ |
␍␊ |
public bool IsNewVirtualButtonRelease(Buttons button)␍␊ |
{␍␊ |
return (_lastVirtualState.IsButtonDown(button) &&␍␊ |
_currentVirtualState.IsButtonUp(button));␍␊ |
}␍␊ |
}␍␊ |
}␍␊ |