| ␍␊ |
| 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));␍␊ |
| }␍␊ |
| }␍␊ |
| }␍␊ |