ZunePadState
From XNAWiki
This code implements a nice wrapper for Zune input. It wraps the buttons to have some better names and even tracks flicks and taps for extra input.
public struct ZunePadState { GamePadState state; Vector2 flick; bool tapped; public bool IsTouched { get { return state.Buttons.LeftStick == ButtonState.Pressed; } } public bool IsTapped { get { return tapped; } } public Vector2 Flick { get { return flick; } } public Vector2 TouchPosition { get { return state.ThumbSticks.Left; } } public ButtonState BackButton { get { return state.Buttons.Back; } } public ButtonState PlayButton { get { return state.Buttons.B; } } //used when the zune's pad is clicked in the center public ButtonState A { get { return state.Buttons.A; } } //tells if the zune's pad has been clicked at any point public ButtonState PadPressed { get { return state.Buttons.LeftShoulder; } } public GamePadDPad DPad { get { return state.DPad; } } public ZunePadState(GamePadState state, Vector2 flick, bool tapped) { this.state = state; this.flick = flick; this.tapped = tapped; } } public static class ZunePad { static ZunePadState zps; static TimeSpan flickStartTime; static Vector2 flickStart; /// <summary> /// Gets the state of the Zune input allowing for flicks and taps. /// </summary> /// <param name="gameTime">The current time snapshot</param> /// <returns>The new ZunePadState object.</returns> public static ZunePadState GetState(GameTime gameTime) { GamePadState gps = GamePad.GetState(PlayerIndex.One, GamePadDeadZone.None); Vector2 flick = Vector2.Zero; bool tapped = false; if (gps.Buttons.LeftStick == ButtonState.Pressed && !zps.IsTouched) { flickStart = gps.ThumbSticks.Left; flickStartTime = gameTime.TotalGameTime; } else if (gps.Buttons.LeftStick == ButtonState.Released && zps.IsTouched) { flick = zps.TouchPosition - flickStart; TimeSpan elapsed = gameTime.TotalGameTime - flickStartTime; //scale the flick based on how long it took flick /= (float)elapsed.TotalSeconds; //adjust the .5 and .3 to fit your sensitivity needs. .5 and .3 seem //to be pretty decent, but they might need tweaking for some situations tapped = (flick.Length() < .5f && elapsed.TotalSeconds < .3f); flickStart = Vector2.Zero; } zps = new ZunePadState(gps, flick, tapped); return zps; } /// <summary> /// Gets the state of the Zune input without flicks or taps. /// </summary> /// <returns>The new ZunePadState object.</returns> public static ZunePadState GetState() { GamePadState gps = GamePad.GetState(PlayerIndex.One, GamePadDeadZone.None); zps = new ZunePadState(gps, Vector2.Zero, false); return zps; } }
