Only disable most recent input if transition into state is successful
This commit is contained in:
parent
bd195c7ee8
commit
6c06611901
@ -59,9 +59,6 @@ bool UFFInputBufferComponent::CheckInputSequence(const FFFInputSequence& InputSe
|
||||
// All conditions were met
|
||||
if(CondIdx == -1)
|
||||
{
|
||||
// disable most recent input
|
||||
InputBuffer[InputBuffer.Num() - 1].DisabledButtons |= InputBuffer[InputBuffer.Num() - 1].Buttons;
|
||||
InputBuffer[InputBuffer.Num() - 2].DisabledButtons |= InputBuffer[InputBuffer.Num() - 2].Buttons;
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -74,3 +71,9 @@ bool UFFInputBufferComponent::CheckInputSequence(const FFFInputSequence& InputSe
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void UFFInputBufferComponent::DisableMostRecentInput()
|
||||
{
|
||||
InputBuffer[InputBuffer.Num() - 1].DisabledButtons |= InputBuffer[InputBuffer.Num() - 1].Buttons;
|
||||
InputBuffer[InputBuffer.Num() - 2].DisabledButtons |= InputBuffer[InputBuffer.Num() - 2].Buttons;
|
||||
}
|
||||
|
@ -94,6 +94,8 @@ public:
|
||||
|
||||
bool CheckInputSequence(const FFFInputSequence& InputSequence);
|
||||
|
||||
void DisableMostRecentInput();
|
||||
|
||||
protected:
|
||||
/** The underlying buffer data structure for holding past input states */
|
||||
TCircleBuffer<FFFInputState, 120> InputBuffer;
|
||||
|
@ -56,6 +56,11 @@ bool AFFPlayerController::CheckInputSequences(const TArray<FFFInputSequence>& In
|
||||
return false;
|
||||
}
|
||||
|
||||
void AFFPlayerController::DisableMostRecentInput()
|
||||
{
|
||||
InputBuffer->DisableMostRecentInput();
|
||||
}
|
||||
|
||||
|
||||
void AFFPlayerController::SetupInputComponent()
|
||||
{
|
||||
|
@ -55,6 +55,8 @@ public:
|
||||
virtual bool CheckInputSequence(const FFFInputSequence& InInputSequence) override;
|
||||
|
||||
virtual bool CheckInputSequences(const TArray<FFFInputSequence>& InputSequences) override;
|
||||
|
||||
virtual void DisableMostRecentInput() override;
|
||||
// End of IFFStateOwnerInterface
|
||||
|
||||
// APlayerController interface
|
||||
|
@ -4,6 +4,7 @@
|
||||
|
||||
// FF includes
|
||||
#include "FFState.h"
|
||||
#include "Input/FFPlayerController.h"
|
||||
|
||||
#if !UE_BUILD_SHIPPING
|
||||
static int32 StateMachineDebug = 0;
|
||||
@ -100,6 +101,18 @@ void UFFStateMachineComponent::GoToState(UFFState* NewState)
|
||||
check(CurrentState);
|
||||
check(NewState);
|
||||
|
||||
// if state being transitioned into requires an input sequence we need to disable the most
|
||||
// recent input in the player controller input buffer to prevent unwanted "double firing" of
|
||||
// actions that have short durations but very lenient required input sequences
|
||||
if(NewState->InputSequences.Num() > 0)
|
||||
{
|
||||
IFFStateOwnerInterface* PC = Cast<IFFStateOwnerInterface>(Owner);
|
||||
if(PC)
|
||||
{
|
||||
PC->DisableMostRecentInput();
|
||||
}
|
||||
}
|
||||
|
||||
CurrentState->Exit(GetCurrentStateContext());
|
||||
CurrentState = NewState;
|
||||
CurrentState->Enter(GetCurrentStateContext());
|
||||
|
@ -24,4 +24,6 @@ public:
|
||||
virtual bool CheckInputSequence(const FFFInputSequence& InInputSequence) = 0;
|
||||
|
||||
virtual bool CheckInputSequences(const TArray<FFFInputSequence>& InInputSequences) = 0;
|
||||
|
||||
virtual void DisableMostRecentInput() = 0;
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user