1
0
Fork 0
mirror of https://github.com/Ellpeck/MLEM.git synced 2024-11-26 06:28:35 +01:00

Added InputHandler.InvertPressBehavior

This commit is contained in:
Ell 2022-04-29 15:34:04 +02:00
parent 6393d879d9
commit 46c77d2444
2 changed files with 22 additions and 6 deletions

View file

@ -13,6 +13,7 @@ Jump to version:
Additions Additions
- Added consuming variants of IsPressed methods to InputHandler - Added consuming variants of IsPressed methods to InputHandler
- Added SpriteBatchContext struct and extensions - Added SpriteBatchContext struct and extensions
- Added InputHandler.InvertPressBehavior
### MLEM.Ui ### MLEM.Ui
Additions Additions

View file

@ -61,6 +61,11 @@ namespace MLEM.Input {
/// Querying of analog values is done using <see cref="GamepadExtensions.GetAnalogValue"/>. /// Querying of analog values is done using <see cref="GamepadExtensions.GetAnalogValue"/>.
/// </summary> /// </summary>
public float GamepadButtonDeadzone; public float GamepadButtonDeadzone;
/// <summary>
/// Set this field to true to invert the press behavior of <see cref="IsKeyPressed"/>, <see cref="IsMouseButtonPressed"/>, <see cref="IsGamepadButtonPressed"/> and <see cref="IsPressed"/>.
/// Inverted behavior means that, instead of an input counting as pressed when it was up in the last frame and is now down, it will be counted as pressed when it was down in the last frame and is now up.
/// </summary>
public bool InvertPressBehavior;
/// <summary> /// <summary>
/// An array of all <see cref="Keys"/>, <see cref="Buttons"/> and <see cref="MouseButton"/> values that are currently down. /// An array of all <see cref="Keys"/>, <see cref="Buttons"/> and <see cref="MouseButton"/> values that are currently down.
@ -274,12 +279,14 @@ namespace MLEM.Input {
this.gestures.Add(TouchPanel.ReadGesture()); this.gestures.Add(TouchPanel.ReadGesture());
} }
if (this.inputsDownAccum.Count <= 0) { if (this.inputsDownAccum.Count <= 0 && this.inputsDown.Count <= 0) {
this.InputsPressed = Array.Empty<GenericInput>(); this.InputsPressed = Array.Empty<GenericInput>();
this.InputsDown = Array.Empty<GenericInput>(); this.InputsDown = Array.Empty<GenericInput>();
this.inputsDown.Clear(); this.inputsDown.Clear();
} else { } else {
this.InputsPressed = this.inputsDownAccum.Keys.Where(kv => this.IsPressed(kv.Item1, kv.Item2)).Select(kv => kv.Item1).ToArray(); // if we're inverting press behavior, we need to check the press state for the inputs that were down in the last frame
var down = this.InvertPressBehavior ? this.inputsDown : this.inputsDownAccum;
this.InputsPressed = down.Keys.Where(kv => this.IsPressed(kv.Item1, kv.Item2)).Select(kv => kv.Item1).ToArray();
this.InputsDown = this.inputsDownAccum.Keys.Select(kv => kv.Item1).ToArray(); this.InputsDown = this.inputsDownAccum.Keys.Select(kv => kv.Item1).ToArray();
// swapping these collections means that we don't have to keep moving entries between them // swapping these collections means that we don't have to keep moving entries between them
(this.inputsDown, this.inputsDownAccum) = (this.inputsDownAccum, this.inputsDown); (this.inputsDown, this.inputsDownAccum) = (this.inputsDownAccum, this.inputsDown);
@ -332,7 +339,7 @@ namespace MLEM.Input {
/// <summary> /// <summary>
/// Returns whether the given key is considered pressed. /// Returns whether the given key is considered pressed.
/// A key is considered pressed if it was not down the last update call, but is down the current update call. /// A key is considered pressed if it was not down the last update call, but is down the current update call. If <see cref="InvertPressBehavior"/> is true, this behavior is inverted.
/// If <see cref="HandleKeyboardRepeats"/> is true, this method will also return true to signify a key repeat. /// If <see cref="HandleKeyboardRepeats"/> is true, this method will also return true to signify a key repeat.
/// </summary> /// </summary>
/// <param name="key">The key to query</param> /// <param name="key">The key to query</param>
@ -346,12 +353,15 @@ namespace MLEM.Input {
/// <summary> /// <summary>
/// Returns whether the given key is considered pressed. /// Returns whether the given key is considered pressed.
/// A key is considered pressed if it was not down the last update call, but is down the current update call. If <see cref="InvertPressBehavior"/> is true, this behavior is inverted.
/// This has the same behavior as <see cref="IsKeyPressed"/>, but ignores keyboard repeat events. /// This has the same behavior as <see cref="IsKeyPressed"/>, but ignores keyboard repeat events.
/// If <see cref="HandleKeyboardRepeats"/> is false, this method does the same as <see cref="IsKeyPressed"/>. /// If <see cref="HandleKeyboardRepeats"/> is false, this method does the same as <see cref="IsKeyPressed"/>.
/// </summary> /// </summary>
/// <param name="key">The key to query</param> /// <param name="key">The key to query</param>
/// <returns>If the key is pressed</returns> /// <returns>If the key is pressed</returns>
public bool IsKeyPressedIgnoreRepeats(Keys key) { public bool IsKeyPressedIgnoreRepeats(Keys key) {
if (this.InvertPressBehavior)
return this.WasKeyDown(key) && this.IsKeyUp(key);
return this.WasKeyUp(key) && this.IsKeyDown(key); return this.WasKeyUp(key) && this.IsKeyDown(key);
} }
@ -422,11 +432,13 @@ namespace MLEM.Input {
/// <summary> /// <summary>
/// Returns whether the given mouse button is considered pressed. /// Returns whether the given mouse button is considered pressed.
/// A mouse button is considered pressed if it was up the last update call, and is down the current update call. /// A mouse button is considered pressed if it was up the last update call, and is down the current update call. If <see cref="InvertPressBehavior"/> is true, this behavior is inverted.
/// </summary> /// </summary>
/// <param name="button">The button to query</param> /// <param name="button">The button to query</param>
/// <returns>Whether the button is pressed</returns> /// <returns>Whether the button is pressed</returns>
public bool IsMouseButtonPressed(MouseButton button) { public bool IsMouseButtonPressed(MouseButton button) {
if (this.InvertPressBehavior)
return this.WasMouseButtonDown(button) && this.IsMouseButtonUp(button);
return this.WasMouseButtonUp(button) && this.IsMouseButtonDown(button); return this.WasMouseButtonUp(button) && this.IsMouseButtonDown(button);
} }
@ -495,7 +507,7 @@ namespace MLEM.Input {
/// <summary> /// <summary>
/// Returns whether the given gamepad button on the given index is considered pressed. /// Returns whether the given gamepad button on the given index is considered pressed.
/// A gamepad button is considered pressed if it was down the last update call, and is up the current update call. /// A gamepad button is considered pressed if it was down the last update call, and is up the current update call. If <see cref="InvertPressBehavior"/> is true, this behavior is inverted.
/// If <see cref="HandleGamepadRepeats"/> is true, this method will also return true to signify a gamepad button repeat. /// If <see cref="HandleGamepadRepeats"/> is true, this method will also return true to signify a gamepad button repeat.
/// </summary> /// </summary>
/// <param name="button">The button to query</param> /// <param name="button">The button to query</param>
@ -517,6 +529,7 @@ namespace MLEM.Input {
/// <summary> /// <summary>
/// Returns whether the given key is considered pressed. /// Returns whether the given key is considered pressed.
/// A gamepad button is considered pressed if it was down the last update call, and is up the current update call. If <see cref="InvertPressBehavior"/> is true, this behavior is inverted.
/// This has the same behavior as <see cref="IsGamepadButtonPressed"/>, but ignores gamepad repeat events. /// This has the same behavior as <see cref="IsGamepadButtonPressed"/>, but ignores gamepad repeat events.
/// If <see cref="HandleGamepadRepeats"/> is false, this method does the same as <see cref="IsGamepadButtonPressed"/>. /// If <see cref="HandleGamepadRepeats"/> is false, this method does the same as <see cref="IsGamepadButtonPressed"/>.
/// </summary> /// </summary>
@ -524,6 +537,8 @@ namespace MLEM.Input {
/// <param name="index">The zero-based index of the gamepad, or -1 for any gamepad</param> /// <param name="index">The zero-based index of the gamepad, or -1 for any gamepad</param>
/// <returns>Whether the given button is pressed</returns> /// <returns>Whether the given button is pressed</returns>
public bool IsGamepadButtonPressedIgnoreRepeats(Buttons button, int index = -1) { public bool IsGamepadButtonPressedIgnoreRepeats(Buttons button, int index = -1) {
if (this.InvertPressBehavior)
return this.WasGamepadButtonDown(button, index) && this.IsGamepadButtonUp(button, index);
return this.WasGamepadButtonUp(button, index) && this.IsGamepadButtonDown(button, index); return this.WasGamepadButtonUp(button, index) && this.IsGamepadButtonDown(button, index);
} }