summaryrefslogtreecommitdiff
path: root/Plugins/MonoGame.Extended/source/MonoGame.Extended.Input/MouseStateExtended.cs
diff options
context:
space:
mode:
authorchai <215380520@qq.com>2024-06-03 10:15:45 +0800
committerchai <215380520@qq.com>2024-06-03 10:15:45 +0800
commitacea7b2e728787a0d83bbf83c8c1f042d2c32e7e (patch)
tree0bfec05c1ca2d71be2c337bcd110a0421f19318b /Plugins/MonoGame.Extended/source/MonoGame.Extended.Input/MouseStateExtended.cs
parent88febcb02bf127d961c6471d9e846c0e1315f5c3 (diff)
+ plugins project
Diffstat (limited to 'Plugins/MonoGame.Extended/source/MonoGame.Extended.Input/MouseStateExtended.cs')
-rw-r--r--Plugins/MonoGame.Extended/source/MonoGame.Extended.Input/MouseStateExtended.cs149
1 files changed, 149 insertions, 0 deletions
diff --git a/Plugins/MonoGame.Extended/source/MonoGame.Extended.Input/MouseStateExtended.cs b/Plugins/MonoGame.Extended/source/MonoGame.Extended.Input/MouseStateExtended.cs
new file mode 100644
index 0000000..0ec6943
--- /dev/null
+++ b/Plugins/MonoGame.Extended/source/MonoGame.Extended.Input/MouseStateExtended.cs
@@ -0,0 +1,149 @@
+using System;
+using Microsoft.Xna.Framework;
+using Microsoft.Xna.Framework.Input;
+
+namespace MonoGame.Extended.Input
+{
+ public struct MouseStateExtended
+ {
+ private readonly MouseState _currentMouseState;
+ private readonly MouseState _previousMouseState;
+
+ public MouseStateExtended(MouseState currentMouseState, MouseState previousMouseState)
+ {
+ _currentMouseState = currentMouseState;
+ _previousMouseState = previousMouseState;
+ }
+
+ public int X => _currentMouseState.X;
+ public int Y => _currentMouseState.Y;
+ public Point Position => _currentMouseState.Position;
+ public bool PositionChanged => _currentMouseState.Position != _previousMouseState.Position;
+
+ public int DeltaX => _previousMouseState.X - _currentMouseState.X;
+ public int DeltaY => _previousMouseState.Y - _currentMouseState.Y;
+ public Point DeltaPosition => new Point(DeltaX, DeltaY);
+
+ public int ScrollWheelValue => _currentMouseState.ScrollWheelValue;
+ public int DeltaScrollWheelValue => _previousMouseState.ScrollWheelValue - _currentMouseState.ScrollWheelValue;
+
+ public ButtonState LeftButton => _currentMouseState.LeftButton;
+ public ButtonState MiddleButton => _currentMouseState.MiddleButton;
+ public ButtonState RightButton => _currentMouseState.RightButton;
+ public ButtonState XButton1 => _currentMouseState.XButton1;
+ public ButtonState XButton2 => _currentMouseState.XButton2;
+
+ public bool IsButtonDown(MouseButton button)
+ {
+ // ReSharper disable once SwitchStatementMissingSomeCases
+ switch (button)
+ {
+ case MouseButton.Left: return IsPressed(m => m.LeftButton);
+ case MouseButton.Middle: return IsPressed(m => m.MiddleButton);
+ case MouseButton.Right: return IsPressed(m => m.RightButton);
+ case MouseButton.XButton1: return IsPressed(m => m.XButton1);
+ case MouseButton.XButton2: return IsPressed(m => m.XButton2);
+ }
+
+ return false;
+ }
+
+ public bool IsButtonUp(MouseButton button)
+ {
+ // ReSharper disable once SwitchStatementMissingSomeCases
+ switch (button)
+ {
+ case MouseButton.Left: return IsReleased(m => m.LeftButton);
+ case MouseButton.Middle: return IsReleased(m => m.MiddleButton);
+ case MouseButton.Right: return IsReleased(m => m.RightButton);
+ case MouseButton.XButton1: return IsReleased(m => m.XButton1);
+ case MouseButton.XButton2: return IsReleased(m => m.XButton2);
+ }
+
+ return false;
+ }
+
+ /// <summary>
+ /// Get the just-down state for the mouse on this state-change: true if the mouse button has just been pressed.
+ /// </summary>
+ /// <param name="button"></param>
+ /// <remarks>Deprecated because of inconsistency with <see cref="KeyboardStateExtended"/></remarks>
+ /// <returns>The just-down state for the mouse on this state-change.</returns>
+ [Obsolete($"Deprecated in favor of {nameof(IsButtonPressed)}")]
+ public bool WasButtonJustDown(MouseButton button)
+ {
+ // ReSharper disable once SwitchStatementMissingSomeCases
+ switch (button)
+ {
+ case MouseButton.Left: return WasJustPressed(m => m.LeftButton);
+ case MouseButton.Middle: return WasJustPressed(m => m.MiddleButton);
+ case MouseButton.Right: return WasJustPressed(m => m.RightButton);
+ case MouseButton.XButton1: return WasJustPressed(m => m.XButton1);
+ case MouseButton.XButton2: return WasJustPressed(m => m.XButton2);
+ }
+
+ return false;
+ }
+
+ /// <summary>
+ /// Get the just-up state for the mouse on this state-change: true if the mouse button has just been released.
+ /// </summary>
+ /// <param name="button"></param>
+ /// <remarks>Deprecated because of inconsistency with <see cref="KeyboardStateExtended"/></remarks>
+ /// <returns>The just-up state for the mouse on this state-change.</returns>
+ [Obsolete($"Deprecated in favor of {nameof(IsButtonReleased)}")]
+ public bool WasButtonJustUp(MouseButton button)
+ {
+ // ReSharper disable once SwitchStatementMissingSomeCases
+ switch (button)
+ {
+ case MouseButton.Left: return WasJustReleased(m => m.LeftButton);
+ case MouseButton.Middle: return WasJustReleased(m => m.MiddleButton);
+ case MouseButton.Right: return WasJustReleased(m => m.RightButton);
+ case MouseButton.XButton1: return WasJustReleased(m => m.XButton1);
+ case MouseButton.XButton2: return WasJustReleased(m => m.XButton2);
+ }
+
+ return false;
+ }
+
+ /// <summary>
+ /// Get the pressed state of a mouse button, for this state-change.
+ /// </summary>
+ /// <param name="button">The button to check.</param>
+ /// <returns>true if the given mouse button was pressed this state-change, otherwise false</returns>
+ public readonly bool IsButtonPressed(MouseButton button) => button switch
+ {
+ MouseButton.Left => WasJustPressed(m => m.LeftButton),
+ MouseButton.Middle => WasJustPressed(m => m.MiddleButton),
+ MouseButton.Right => WasJustPressed(m => m.RightButton),
+ MouseButton.XButton1 => WasJustPressed(m => m.XButton1),
+ MouseButton.XButton2 => WasJustPressed(m => m.XButton2),
+ _ => false,
+ };
+
+ /// <summary>
+ /// Get the released state of a mouse button, for this state-change.
+ /// </summary>
+ /// <param name="button">The button to check.</param>
+ /// <returns>true if the given mouse button was released this state-change, otherwise false</returns>
+ public readonly bool IsButtonReleased(MouseButton button) => button switch
+ {
+ MouseButton.Left => WasJustReleased(m => m.LeftButton),
+ MouseButton.Middle => WasJustReleased(m => m.MiddleButton),
+ MouseButton.Right => WasJustReleased(m => m.RightButton),
+ MouseButton.XButton1 => WasJustReleased(m => m.XButton1),
+ MouseButton.XButton2 => WasJustReleased(m => m.XButton2),
+ _ => false,
+ };
+
+ private readonly bool IsPressed(Func<MouseState, ButtonState> button)
+ => button(_currentMouseState) == ButtonState.Pressed;
+ private readonly bool IsReleased(Func<MouseState, ButtonState> button)
+ => button(_currentMouseState) == ButtonState.Released;
+ private readonly bool WasJustPressed(Func<MouseState, ButtonState> button)
+ => button(_previousMouseState) == ButtonState.Released && button(_currentMouseState) == ButtonState.Pressed;
+ private readonly bool WasJustReleased(Func<MouseState, ButtonState> button)
+ => button(_previousMouseState) == ButtonState.Pressed && button(_currentMouseState) == ButtonState.Released;
+ }
+}