diff --git a/src/Graphics/Utility/Conversions.cs b/src/Graphics/Utility/Conversions.cs
index c7d04b7..5a8f43e 100644
--- a/src/Graphics/Utility/Conversions.cs
+++ b/src/Graphics/Utility/Conversions.cs
@@ -1,4 +1,4 @@
-namespace MoonWorks.Graphics
+namespace MoonWorks
{
public static class Conversions
{
@@ -6,5 +6,10 @@ namespace MoonWorks.Graphics
{
return (byte)(b ? 1 : 0);
}
+
+ public static bool ByteToBool(byte b)
+ {
+ return b == 0 ? false : true;
+ }
}
}
diff --git a/src/Input/ButtonState.cs b/src/Input/ButtonState.cs
index f08fb7a..714c09c 100644
--- a/src/Input/ButtonState.cs
+++ b/src/Input/ButtonState.cs
@@ -1,18 +1,31 @@
namespace MoonWorks.Input
{
- public enum ButtonState
+ public class ButtonState
{
- ///
- /// Indicates that the input is not pressed.
- ///
- Released,
- ///
- /// Indicates that the input was pressed this frame.
- ///
- Pressed,
- ///
- /// Indicates that the input has been held for multiple frames.
- ///
- Held
+ private ButtonStatus ButtonStatus { get; set; }
+
+ public bool IsPressed => ButtonStatus == ButtonStatus.Pressed;
+ public bool IsHeld => ButtonStatus == ButtonStatus.Held;
+ public bool IsDown => ButtonStatus == ButtonStatus.Pressed || ButtonStatus == ButtonStatus.Held;
+ public bool IsReleased => ButtonStatus == ButtonStatus.Released;
+
+ internal void Update(bool isPressed)
+ {
+ if (isPressed)
+ {
+ if (ButtonStatus == ButtonStatus.Pressed)
+ {
+ ButtonStatus = ButtonStatus.Held;
+ }
+ else if (ButtonStatus == ButtonStatus.Released)
+ {
+ ButtonStatus = ButtonStatus.Pressed;
+ }
+ }
+ else
+ {
+ ButtonStatus = ButtonStatus.Released;
+ }
+ }
}
}
diff --git a/src/Input/ButtonStatus.cs b/src/Input/ButtonStatus.cs
new file mode 100644
index 0000000..6144605
--- /dev/null
+++ b/src/Input/ButtonStatus.cs
@@ -0,0 +1,18 @@
+namespace MoonWorks.Input
+{
+ internal enum ButtonStatus
+ {
+ ///
+ /// Indicates that the input is not pressed.
+ ///
+ Released,
+ ///
+ /// Indicates that the input was pressed this frame.
+ ///
+ Pressed,
+ ///
+ /// Indicates that the input has been held for multiple frames.
+ ///
+ Held
+ }
+}
diff --git a/src/Input/Gamepad.cs b/src/Input/Gamepad.cs
index 921fddb..af17f4a 100644
--- a/src/Input/Gamepad.cs
+++ b/src/Input/Gamepad.cs
@@ -7,21 +7,21 @@ namespace MoonWorks.Input
{
internal IntPtr Handle;
- public ButtonState A { get; private set; }
- public ButtonState B { get; private set; }
- public ButtonState X { get; private set; }
- public ButtonState Y { get; private set; }
- public ButtonState Back { get; private set; }
- public ButtonState Guide { get; private set; }
- public ButtonState Start { get; private set; }
- public ButtonState LeftStick { get; private set; }
- public ButtonState RightStick { get; private set; }
- public ButtonState LeftShoulder { get; private set; }
- public ButtonState RightShoulder { get; private set; }
- public ButtonState DpadUp { get; private set; }
- public ButtonState DpadDown { get; private set; }
- public ButtonState DpadLeft { get; private set; }
- public ButtonState DpadRight { get; private set; }
+ public ButtonState A { get; } = new ButtonState();
+ public ButtonState B { get; } = new ButtonState();
+ public ButtonState X { get; } = new ButtonState();
+ public ButtonState Y { get; } = new ButtonState();
+ public ButtonState Back { get; } = new ButtonState();
+ public ButtonState Guide { get; } = new ButtonState();
+ public ButtonState Start { get; } = new ButtonState();
+ public ButtonState LeftStick { get; } = new ButtonState();
+ public ButtonState RightStick { get; } = new ButtonState();
+ public ButtonState LeftShoulder { get; } = new ButtonState();
+ public ButtonState RightShoulder { get; } = new ButtonState();
+ public ButtonState DpadUp { get; } = new ButtonState();
+ public ButtonState DpadDown { get; } = new ButtonState();
+ public ButtonState DpadLeft { get; } = new ButtonState();
+ public ButtonState DpadRight { get; } = new ButtonState();
public float LeftX { get; private set; }
public float LeftY { get; private set; }
@@ -37,21 +37,21 @@ namespace MoonWorks.Input
internal void Update()
{
- A = UpdateState(A, SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_A);
- B = UpdateState(B, SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_B);
- X = UpdateState(X, SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_X);
- Y = UpdateState(Y, SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_Y);
- Back = UpdateState(Back, SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_BACK);
- Guide = UpdateState(Guide, SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_GUIDE);
- Start = UpdateState(Start, SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_START);
- LeftStick = UpdateState(LeftStick, SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_LEFTSTICK);
- RightStick = UpdateState(RightStick, SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_RIGHTSTICK);
- LeftShoulder = UpdateState(LeftShoulder, SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_LEFTSHOULDER);
- RightShoulder = UpdateState(RightShoulder, SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_RIGHTSHOULDER);
- DpadUp = UpdateState(DpadUp, SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_DPAD_UP);
- DpadDown = UpdateState(DpadDown, SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_DPAD_DOWN);
- DpadLeft = UpdateState(DpadLeft, SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_DPAD_LEFT);
- DpadRight = UpdateState(DpadRight, SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_DPAD_RIGHT);
+ A.Update(IsPressed(SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_A));
+ B.Update(IsPressed(SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_B));
+ X.Update(IsPressed(SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_X));
+ Y.Update(IsPressed(SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_Y));
+ Back.Update(IsPressed(SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_BACK));
+ Guide.Update(IsPressed(SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_GUIDE));
+ Start.Update(IsPressed(SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_START));
+ LeftStick.Update(IsPressed(SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_LEFTSTICK));
+ RightStick.Update(IsPressed(SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_RIGHTSTICK));
+ LeftShoulder.Update(IsPressed(SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_LEFTSHOULDER));
+ RightShoulder.Update(IsPressed(SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_RIGHTSHOULDER));
+ DpadUp.Update(IsPressed(SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_DPAD_UP));
+ DpadDown.Update(IsPressed(SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_DPAD_DOWN));
+ DpadLeft.Update(IsPressed(SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_DPAD_LEFT));
+ DpadRight.Update(IsPressed(SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_DPAD_RIGHT));
LeftX = UpdateAxis(SDL.SDL_GameControllerAxis.SDL_CONTROLLER_AXIS_LEFTX);
LeftY = UpdateAxis(SDL.SDL_GameControllerAxis.SDL_CONTROLLER_AXIS_LEFTY);
@@ -61,23 +61,9 @@ namespace MoonWorks.Input
TriggerRight = UpdateTrigger(SDL.SDL_GameControllerAxis.SDL_CONTROLLER_AXIS_TRIGGERRIGHT);
}
- private ButtonState UpdateState(ButtonState state, SDL.SDL_GameControllerButton button)
+ private bool IsPressed(SDL.SDL_GameControllerButton button)
{
- var isPressed = SDL.SDL_GameControllerGetButton(Handle, button);
-
- if (isPressed == 1)
- {
- if (state == ButtonState.Pressed)
- {
- return ButtonState.Held;
- }
- else if (state == ButtonState.Released)
- {
- return ButtonState.Pressed;
- }
- }
-
- return ButtonState.Released;
+ return MoonWorks.Conversions.ByteToBool(SDL.SDL_GameControllerGetButton(Handle, button));
}
private float UpdateAxis(SDL.SDL_GameControllerAxis axis)
diff --git a/src/Input/Key.cs b/src/Input/Key.cs
deleted file mode 100644
index d187596..0000000
--- a/src/Input/Key.cs
+++ /dev/null
@@ -1,14 +0,0 @@
-namespace MoonWorks.Input
-{
- internal class Key
- {
- public Keycode Keycode { get; }
- public ButtonState InputState { get; internal set; }
-
- public Key(Keycode keycode)
- {
- Keycode = keycode;
- InputState = ButtonState.Released;
- }
- }
-}
diff --git a/src/Input/Keyboard.cs b/src/Input/Keyboard.cs
index 60c4451..efe928b 100644
--- a/src/Input/Keyboard.cs
+++ b/src/Input/Keyboard.cs
@@ -6,17 +6,17 @@ namespace MoonWorks.Input
{
public class Keyboard
{
- private Key[] Keys { get; }
+ private ButtonState[] Keys { get; }
private int numKeys;
internal Keyboard()
{
SDL.SDL_GetKeyboardState(out numKeys);
- Keys = new Key[numKeys];
+ Keys = new ButtonState[numKeys];
foreach (Keycode keycode in Enum.GetValues(typeof(Keycode)))
{
- Keys[(int)keycode] = new Key(keycode);
+ Keys[(int)keycode] = new ButtonState();
}
}
@@ -27,47 +27,28 @@ namespace MoonWorks.Input
foreach (int keycode in Enum.GetValues(typeof(Keycode)))
{
var keyDown = Marshal.ReadByte(keyboardState, keycode);
-
- if (keyDown == 1)
- {
- if (Keys[keycode].InputState == ButtonState.Released)
- {
- Keys[keycode].InputState = ButtonState.Pressed;
- }
- else if (Keys[keycode].InputState == ButtonState.Pressed)
- {
- Keys[keycode].InputState = ButtonState.Held;
- }
- }
- else
- {
- Keys[keycode].InputState = ButtonState.Released;
- }
+ Keys[keycode].Update(Conversions.ByteToBool(keyDown));
}
}
public bool IsDown(Keycode keycode)
{
- var key = Keys[(int)keycode];
- return (key.InputState == ButtonState.Pressed) || (key.InputState == ButtonState.Held);
+ return Keys[(int)keycode].IsDown;
}
public bool IsPressed(Keycode keycode)
{
- var key = Keys[(int)keycode];
- return key.InputState == ButtonState.Pressed;
+ return Keys[(int)keycode].IsPressed;
}
public bool IsHeld(Keycode keycode)
{
- var key = Keys[(int)keycode];
- return key.InputState == ButtonState.Held;
+ return Keys[(int)keycode].IsHeld;
}
- public bool IsUp(Keycode keycode)
+ public bool IsReleased(Keycode keycode)
{
- var key = Keys[(int)keycode];
- return key.InputState == ButtonState.Released;
+ return Keys[(int)keycode].IsReleased;
}
}
}
diff --git a/src/Input/Mouse.cs b/src/Input/Mouse.cs
index eb22e02..13ffb10 100644
--- a/src/Input/Mouse.cs
+++ b/src/Input/Mouse.cs
@@ -4,9 +4,9 @@ namespace MoonWorks.Input
{
public class Mouse
{
- public ButtonState LeftButton { get; private set; }
- public ButtonState MiddleButton { get; private set; }
- public ButtonState RightButton { get; private set; }
+ public ButtonState LeftButton { get; } = new ButtonState();
+ public ButtonState MiddleButton { get; } = new ButtonState();
+ public ButtonState RightButton { get; } = new ButtonState();
public int X { get; private set; }
public int Y { get; private set; }
@@ -21,8 +21,8 @@ namespace MoonWorks.Input
{
relativeMode = value;
SDL.SDL_SetRelativeMouseMode(
- relativeMode ?
- SDL.SDL_bool.SDL_TRUE :
+ relativeMode ?
+ SDL.SDL_bool.SDL_TRUE :
SDL.SDL_bool.SDL_FALSE
);
}
@@ -30,7 +30,7 @@ namespace MoonWorks.Input
internal void Update()
{
- var buttons = SDL.SDL_GetMouseState(out var x, out var y);
+ var buttonMask = SDL.SDL_GetMouseState(out var x, out var y);
var _ = SDL.SDL_GetRelativeMouseState(out var deltaX, out var deltaY);
X = x;
@@ -38,28 +38,14 @@ namespace MoonWorks.Input
DeltaX = deltaX;
DeltaY = deltaY;
- LeftButton = UpdateState(LeftButton, buttons, SDL.SDL_BUTTON_LMASK);
- MiddleButton = UpdateState(MiddleButton, buttons, SDL.SDL_BUTTON_MMASK);
- RightButton = UpdateState(RightButton, buttons, SDL.SDL_BUTTON_RMASK);
+ LeftButton.Update(IsPressed(buttonMask, SDL.SDL_BUTTON_LMASK));
+ MiddleButton.Update(IsPressed(buttonMask, SDL.SDL_BUTTON_MMASK));
+ RightButton.Update(IsPressed(buttonMask, SDL.SDL_BUTTON_RMASK));
}
- private ButtonState UpdateState(ButtonState state, uint buttonMask, uint buttonFlag)
+ private bool IsPressed(uint buttonMask, uint buttonFlag)
{
- var isPressed = buttonMask & buttonFlag;
-
- if (isPressed != 0)
- {
- if (state == ButtonState.Pressed)
- {
- return ButtonState.Held;
- }
- else if (state == ButtonState.Released)
- {
- return ButtonState.Pressed;
- }
- }
-
- return ButtonState.Released;
+ return (buttonMask & buttonFlag) != 0;
}
}
}