101 lines
1.8 KiB
C++
101 lines
1.8 KiB
C++
#include "Keyboard.h"
|
|
|
|
namespace TLAC::Input
|
|
{
|
|
Keyboard* Keyboard::instance;
|
|
|
|
Keyboard::Keyboard()
|
|
{
|
|
}
|
|
|
|
Keyboard* Keyboard::GetInstance()
|
|
{
|
|
if (instance == nullptr)
|
|
instance = new Keyboard();
|
|
|
|
return instance;
|
|
}
|
|
|
|
bool Keyboard::PollInput()
|
|
{
|
|
lastState = currentState;
|
|
|
|
float elapsed = keyIntervalWatch.Restart();
|
|
|
|
for (BYTE i = 0; i < KEYBOARD_KEYS; i++)
|
|
{
|
|
// DOWN
|
|
bool isDown = GetAsyncKeyState(i) < 0;
|
|
currentState.KeyStates[i] = isDown;
|
|
|
|
// DOUBLE TAPPED
|
|
bool isTapped = IsTapped(i);
|
|
keyDoubleTapStates[i] = isTapped ? keyDoubleTapWatches[i].Restart() <= DOUBLE_TAP_THRESHOLD : false;
|
|
|
|
// INTERVAL TAPPED
|
|
keyIntervalTapStates[i] = isTapped;
|
|
|
|
if (isTapped)
|
|
{
|
|
keyIntervalTapTimes[i] = 0;
|
|
keyIntervalInitials[i] = true;
|
|
}
|
|
else if (isDown)
|
|
{
|
|
float threshold = keyIntervalInitials[i] ? INTERVAL_TAP_DELAY_THRESHOLD : INTERVAL_TAP_THRESHOLD;
|
|
|
|
bool intervalTapped = (keyIntervalTapTimes[i] += elapsed) > threshold;
|
|
keyIntervalTapStates[i] = intervalTapped;
|
|
|
|
if (intervalTapped)
|
|
{
|
|
keyIntervalTapTimes[i] = 0;
|
|
keyIntervalInitials[i] = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool Keyboard::IsDown(BYTE keycode)
|
|
{
|
|
return currentState.IsDown(keycode);
|
|
}
|
|
|
|
bool Keyboard::IsUp(BYTE keycode)
|
|
{
|
|
return !IsDown(keycode);
|
|
}
|
|
|
|
bool Keyboard::IsTapped(BYTE keycode)
|
|
{
|
|
return IsDown(keycode) && WasUp(keycode);
|
|
}
|
|
|
|
bool Keyboard::IsDoubleTapped(BYTE keycode)
|
|
{
|
|
return keyDoubleTapStates[keycode];
|
|
}
|
|
|
|
bool Keyboard::IsReleased(BYTE keycode)
|
|
{
|
|
return IsUp(keycode) && WasDown(keycode);
|
|
}
|
|
|
|
inline bool Keyboard::WasDown(BYTE keycode)
|
|
{
|
|
return lastState.IsDown(keycode);
|
|
}
|
|
|
|
inline bool Keyboard::WasUp(BYTE keycode)
|
|
{
|
|
return !WasDown(keycode);
|
|
}
|
|
|
|
bool Keyboard::IsIntervalTapped(BYTE keycode)
|
|
{
|
|
return keyIntervalTapStates[keycode];
|
|
}
|
|
}
|