Skip to content

Instantly share code, notes, and snippets.

@lindsaygcox
Created February 6, 2019 17:57
Show Gist options
  • Save lindsaygcox/133accdd8fd83cd394185a6b00ea3614 to your computer and use it in GitHub Desktop.
Save lindsaygcox/133accdd8fd83cd394185a6b00ea3614 to your computer and use it in GitHub Desktop.
using System;
using XInputDotNetPure;
public sealed class XInputWrapper
{
private PlayerIndex _playerIndex;
private bool _playerIndexSet;
private GamePadState _state, _prevState;
private const int kPadCount = 4;
public event Action OnAPressed;
public event Action OnAReleased;
public event Action OnBPressed;
public event Action OnBReleased;
public event Action OnXPressed;
public event Action OnXReleased;
public event Action OnYPressed;
public event Action OnYReleased;
public event Action OnStartPressed;
public event Action OnStartReleased;
public event Action OnBackPressed;
public event Action OnBackReleased;
public event Action OnLeftShoulderPressed;
public event Action OnLeftShoulderReleased;
public event Action OnRightShoulderPressed;
public event Action OnRightShoulderReleased;
public event Action OnGuidePressed;
public event Action OnGuideReleased;
public event Action OnLeftStickPressed;
public event Action OnLeftStickReleased;
public event Action OnRightStickPressed;
public event Action OnRightStickReleased;
public float LeftStickX
{
get
{
return _state.ThumbSticks.Left.X;
}
}
public float LeftStickY
{
get
{
return _state.ThumbSticks.Left.Y;
}
}
public float RightStickX
{
get
{
return _state.ThumbSticks.Right.X;
}
}
public float RightStickY
{
get
{
return _state.ThumbSticks.Right.Y;
}
}
public void Update()
{
PlayerIndexUpdate();
if (!_playerIndexSet)
{
return;
}
StateUpdate();
ButtonsUpdate();
}
private void PlayerIndexUpdate()
{
if (!_playerIndexSet || _prevState.IsConnected)
{
for (int i = 0; i < kPadCount; ++i)
{
PlayerIndex pI = (PlayerIndex)i;
GamePadState state = GamePad.GetState(pI);
if (state.IsConnected)
{
_playerIndex = pI;
_playerIndexSet = true;
}
}
}
}
private void StateUpdate()
{
_prevState = _state;
_state = GamePad.GetState(_playerIndex);
}
private void ButtonsUpdate()
{
//START
if (_prevState.Buttons.Start == ButtonState.Released && _state.Buttons.Start == ButtonState.Pressed)
{
OnStartPressed?.Invoke();
}
if (_prevState.Buttons.Start == ButtonState.Pressed && _state.Buttons.Start == ButtonState.Released)
{
OnStartReleased?.Invoke();
}
//BACK
if (_prevState.Buttons.Back == ButtonState.Released && _state.Buttons.Back == ButtonState.Pressed)
{
OnBackPressed?.Invoke();
}
if (_prevState.Buttons.Back == ButtonState.Pressed && _state.Buttons.Back == ButtonState.Released)
{
OnBackReleased?.Invoke();
}
//Left Shoulder
if (_prevState.Buttons.LeftShoulder == ButtonState.Released && _state.Buttons.LeftShoulder== ButtonState.Pressed)
{
OnLeftShoulderPressed?.Invoke();
}
if (_prevState.Buttons.LeftShoulder == ButtonState.Pressed && _state.Buttons.LeftShoulder == ButtonState.Released)
{
OnLeftShoulderReleased?.Invoke();
}
//Right Shoulder
if (_prevState.Buttons.RightShoulder == ButtonState.Released && _state.Buttons.RightShoulder == ButtonState.Pressed)
{
OnRightShoulderPressed?.Invoke();
}
if (_prevState.Buttons.RightShoulder == ButtonState.Pressed && _state.Buttons.RightShoulder == ButtonState.Released)
{
OnRightShoulderReleased?.Invoke();
}
//Guide
if (_prevState.Buttons.Guide == ButtonState.Released && _state.Buttons.Guide == ButtonState.Pressed)
{
OnGuidePressed?.Invoke();
}
if (_prevState.Buttons.Guide == ButtonState.Pressed && _state.Buttons.Guide == ButtonState.Released)
{
OnGuideReleased?.Invoke();
}
//A
if (_prevState.Buttons.A == ButtonState.Released && _state.Buttons.A == ButtonState.Pressed)
{
OnAPressed?.Invoke();
}
if (_prevState.Buttons.A == ButtonState.Pressed && _state.Buttons.A == ButtonState.Released)
{
OnAReleased?.Invoke();
}
//B
if (_prevState.Buttons.B == ButtonState.Released && _state.Buttons.B == ButtonState.Pressed)
{
OnBPressed?.Invoke();
}
if (_prevState.Buttons.B == ButtonState.Pressed && _state.Buttons.B == ButtonState.Released)
{
OnBReleased?.Invoke();
}
//Y
if (_prevState.Buttons.Y == ButtonState.Released && _state.Buttons.Y == ButtonState.Pressed)
{
OnYPressed?.Invoke();
}
if (_prevState.Buttons.Y == ButtonState.Pressed && _state.Buttons.Y == ButtonState.Released)
{
OnYReleased?.Invoke();
}
//X
if (_prevState.Buttons.X == ButtonState.Released && _state.Buttons.X == ButtonState.Pressed)
{
OnXPressed?.Invoke();
}
if (_prevState.Buttons.X == ButtonState.Pressed && _state.Buttons.X == ButtonState.Released)
{
OnXReleased?.Invoke();
}
//Left Stick
if (_prevState.Buttons.LeftStick == ButtonState.Released && _state.Buttons.LeftStick == ButtonState.Pressed)
{
OnLeftStickPressed?.Invoke();
}
if (_prevState.Buttons.LeftStick == ButtonState.Pressed && _state.Buttons.LeftStick == ButtonState.Released)
{
OnLeftStickReleased?.Invoke();
}
//Right Stick
if (_prevState.Buttons.RightStick == ButtonState.Released && _state.Buttons.RightStick == ButtonState.Pressed)
{
OnRightStickPressed?.Invoke();
}
if (_prevState.Buttons.RightStick == ButtonState.Pressed && _state.Buttons.RightStick == ButtonState.Released)
{
OnRightStickReleased?.Invoke();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment