Change input event to trigger different input states.

This commit is contained in:
Chandler Cox
2023-09-26 08:35:10 -05:00
parent a672f6aa6b
commit ea1da0481f
3 changed files with 35 additions and 10 deletions

View File

@@ -16,14 +16,24 @@ namespace FlaxEngine
public string Name; public string Name;
/// <summary> /// <summary>
/// Returns true if the event has been triggered during the current frame (e.g. user pressed a key). Use <see cref="Triggered"/> to catch events without active waiting. /// Returns true if the event has been triggered during the current frame (e.g. user pressed a key). Use <see cref="Pressed"/>, <see cref="Pressing"/>, <see cref="Released"/> to catch events without active waiting.
/// </summary> /// </summary>
public bool Active => Input.GetAction(Name); public bool Active => Input.GetAction(Name);
/// <summary> /// <summary>
/// Occurs when event is triggered (e.g. user pressed a key). Called before scripts update. /// Occurs when event is pressed (e.g. user pressed a key). Called before scripts update.
/// </summary> /// </summary>
public event Action Triggered; public event Action Pressed;
/// <summary>
/// Occurs when event is being pressing (e.g. user pressing a key). Called before scripts update.
/// </summary>
public event Action Pressing;
/// <summary>
/// Occurs when event is released (e.g. user releases a key). Called before scripts update.
/// </summary>
public event Action Released;
/// <summary> /// <summary>
/// Initializes a new instance of the <see cref="InputEvent"/> class. /// Initializes a new instance of the <see cref="InputEvent"/> class.
@@ -51,10 +61,25 @@ namespace FlaxEngine
Input.ActionTriggered -= Handler; Input.ActionTriggered -= Handler;
} }
private void Handler(string name) private void Handler(string name, InputActionState state)
{ {
if (string.Equals(name, Name, StringComparison.OrdinalIgnoreCase)) if (!string.Equals(name, Name, StringComparison.OrdinalIgnoreCase))
Triggered?.Invoke(); return;
switch (state)
{
case InputActionState.None: break;
case InputActionState.Waiting: break;
case InputActionState.Pressing:
Pressing?.Invoke();
break;
case InputActionState.Press:
Pressed?.Invoke();
break;
case InputActionState.Release:
Released?.Invoke();
break;
default: break;
}
} }
/// <summary> /// <summary>

View File

@@ -97,7 +97,7 @@ Action Input::MouseLeave;
Delegate<const Float2&, int32> Input::TouchDown; Delegate<const Float2&, int32> Input::TouchDown;
Delegate<const Float2&, int32> Input::TouchMove; Delegate<const Float2&, int32> Input::TouchMove;
Delegate<const Float2&, int32> Input::TouchUp; Delegate<const Float2&, int32> Input::TouchUp;
Delegate<StringView> Input::ActionTriggered; Delegate<StringView, const InputActionState&> Input::ActionTriggered;
Array<ActionConfig> Input::ActionMappings; Array<ActionConfig> Input::ActionMappings;
Array<AxisConfig> Input::AxisMappings; Array<AxisConfig> Input::AxisMappings;
@@ -1022,9 +1022,9 @@ void InputService::Update()
{ {
for (auto i = Actions.Begin(); i.IsNotEnd(); ++i) for (auto i = Actions.Begin(); i.IsNotEnd(); ++i)
{ {
if (i->Value.Active) if (i->Value.State != InputActionState::Waiting)
{ {
Input::ActionTriggered(i->Key); Input::ActionTriggered(i->Key, i->Value.State);
} }
} }
} }

View File

@@ -293,7 +293,7 @@ public:
/// Event fired when virtual input action is triggered. Called before scripts update. See <see cref="ActionMappings"/> to edit configuration. /// Event fired when virtual input action is triggered. Called before scripts update. See <see cref="ActionMappings"/> to edit configuration.
/// </summary> /// </summary>
/// <seealso cref="InputEvent"/> /// <seealso cref="InputEvent"/>
API_EVENT() static Delegate<StringView> ActionTriggered; API_EVENT() static Delegate<StringView, const InputActionState&> ActionTriggered;
/// <summary> /// <summary>
/// Gets the value of the virtual action identified by name. Use <see cref="ActionMappings"/> to get the current config. /// Gets the value of the virtual action identified by name. Use <see cref="ActionMappings"/> to get the current config.