#include "Input/InputBuffer/BufferInputItem.h"
#include "Input/InputUtility.h"
//BufferInputItem
UBufferInputItem::UBufferInputItem()
{
}
UBufferInputItem::UBufferInputItem(uint32 atomAmount)
{
Init(atomAmount);
}
/// <summary>Sets atom amount to the amount given in params. should be the amount of buttons</summary>
void UBufferInputItem::Init(uint32 atomAmount)
{
InputAtoms.SetNum(atomAmount);
}
//void UBufferInputItem::Init(uint32 atomAmount)
//{
// for (uint32 i = 0; i < atomAmount; i++)
// {
// InputAtoms.Add(NewObject<UInputAtom>());
// }
//
// DirectionAtom = NewObject<UInputDirectionAtom>();
//}
/// <summary>Updates all input atoms of this input item</summary>
/// <param name="sel">input bitflag to update with, input bitflag of the previous frame, Time delta</param>
/// <returns>void</returns>
void UBufferInputItem::UpdateInputItem(uint32 inputBitflag, uint32 previousInputBitflag, float deltaTime)
{
//Sets the input bitflag of this buffer input item
InputBitflag = inputBitflag;
//Iterate through the bits the represents buttons in the input bitflag
//Compares the bits to the one of the previous Input Bitflag
for (uint8 i = 0; i < (uint8)Button::NUM; i++)
{
uint32 bitmask = 1 << i;
if (InputBitflag & bitmask)
InputAtoms[i].Hold(deltaTime);
if ((InputBitflag & bitmask) != bitmask && (previousInputBitflag & bitmask) == bitmask)
InputAtoms[i].ReleaseHold();
if ((InputBitflag & bitmask) != bitmask && (previousInputBitflag & bitmask) != bitmask)
InputAtoms[i].Reset();
}
//Iterate through the bits the represents cardinal direction in the input bitflag
//Compares the bits to the one of the previous Input Bitflag
for (uint8 i = (uint8)Button::NUM; i < (uint8)Button::NUM + (uint8)CardinalDirection::NUM; i++)
{
uint32 bitmask = (1 << (i - (uint8)Button::NUM + 32 - (uint8)CardinalDirection::NUM));
if (InputBitflag & bitmask)
InputAtoms[i].Hold(deltaTime);
if ((InputBitflag & bitmask) != bitmask && (previousInputBitflag & bitmask) == bitmask)
InputAtoms[i].ReleaseHold();
if ((InputBitflag & bitmask) != bitmask && (previousInputBitflag & bitmask) != bitmask)
InputAtoms[i].Reset();
}
//convert the input bitflags to a notation to compare them later
DirectionNotation currentDirection = UInputUtility::ConvertInputBitflagToDirectionNotation(inputBitflag);
DirectionNotation previousDirection = UInputUtility::ConvertInputBitflagToDirectionNotation(previousInputBitflag);
ReleasedDirectionAtom = DirectionAtom;
DirectionAtom.Direction = currentDirection;
//if the direction is different than the previous direction we reset the direction timer and update the input state
if(DirectionAtom.Direction != previousDirection)
{
ReleasedDirectionAtom.Hold(deltaTime);
ReleasedDirectionAtom.ReleaseHold();
DirectionAtom.Reset();
DirectionAtom.State = InputState::PRESSED;
}
// else we increment the hold time for the direction
else
{
DirectionAtom.Hold(deltaTime);
}
}
UBufferInputItem& UBufferInputItem::operator=(UBufferInputItem* BUfferInputItem)
{
BeginTimeStamp = BUfferInputItem->BeginTimeStamp;
EndTimeStamp = BUfferInputItem->EndTimeStamp;
InputAtoms = BUfferInputItem->InputAtoms;
DirectionAtom = BUfferInputItem->DirectionAtom;
ReleasedDirectionAtom = BUfferInputItem->ReleasedDirectionAtom;
InputBitflag = BUfferInputItem->InputBitflag;
return *this;
}
//InputAtom
//Set default value's
FInputAtom::FInputAtom()
{
HoldTime = 0.0f;
Consumed = false;
State = InputState::NOT_PRESSED;
}
/// <summary>returns weather the input atom is used or not</summary>
/// <returns>bool, if the atom is consumed</returns>
bool FInputAtom::IsConsumed()
{
//If Button state != Down or Held and the concumed flag is true? then the input is already used and this returns true
//We don't just return the "Consumed" variable because
if ((int8)State > 0 && !Consumed)
{
return false;
}
return true;
}
/// <summary>Consumes the input atom</summary>
void FInputAtom::Consume()
{
//Sets Consumed to true
Consumed = true;
}
/// <summary>Increments hold time of this input atom and sets the buttons state accorsing to the hold time</summary>
/// <param name="sel">Amount to incriment the hold time with</param>
void FInputAtom::Hold(float DeltaTime)
{
//if the button is up and you hold it the button is just pressed
if (State == InputState::NOT_PRESSED || State == InputState::RELEASED)
{
State = InputState::PRESSED;
}
//If it is already Pressed then the button is held down
else
{
State = InputState::HELD;
HoldTime += DeltaTime;
}
}
/// <summary>Sets the state of the buffer item to either RELEASED or NOT_PRESSED depending on it's current state</summary>
void FInputAtom::ReleaseHold()
{
//If the button is down and you release it then the button is just released
if (State == InputState::PRESSED || State == InputState::HELD)
{
State = InputState::RELEASED;
Consumed = false;
}
//If the button is just released or not pressed then the button is not pressed
else
{
State = InputState::NOT_PRESSED;
}
}
///<summary> Force hold to allow for DBFZ style buffer</summary>
void FInputAtom::ForceHold()
{
State = InputState::HELD;
}
///<summary> This resets the input atom</summary>
void FInputAtom::Reset()
{
HoldTime = 0.0f;
State = InputState::NOT_PRESSED;
Consumed = false;
}
//InputDirectionAtom
FInputDirectionAtom::FInputDirectionAtom()
:FInputAtom()
{
Direction = DirectionNotation::NEUTRAL;
}

Recent Comments