This commit is contained in:
nastys
2019-07-30 13:48:28 +02:00
parent 25f819bdfb
commit 998f4274a5
157 changed files with 0 additions and 0 deletions
@@ -0,0 +1,100 @@
#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];
}
}
@@ -0,0 +1,47 @@
#pragma once
#include "../IInputDevice.h"
#include "KeyboardState.h"
#include "../../Utilities/Stopwatch.h"
using Stopwatch = TLAC::Utilities::Stopwatch;
namespace TLAC::Input
{
constexpr float DOUBLE_TAP_THRESHOLD = 200.0f;
constexpr float INTERVAL_TAP_DELAY_THRESHOLD = 500.0f;
constexpr float INTERVAL_TAP_THRESHOLD = 75.0f;
class Keyboard : public IInputDevice
{
public:
static Keyboard* GetInstance();
bool PollInput() override;
bool IsDown(BYTE keycode);
bool IsUp(BYTE keycode);
bool IsTapped(BYTE keycode);
bool IsDoubleTapped(BYTE keycode);
bool IsReleased(BYTE keycode);
bool IsIntervalTapped(BYTE keycode);
bool WasDown(BYTE keycode);
bool WasUp(BYTE keycode);
private:
Keyboard();
KeyboardState lastState;
KeyboardState currentState;
Stopwatch keyIntervalWatch;
BYTE keyDoubleTapStates[KEYBOARD_KEYS];
Stopwatch keyDoubleTapWatches[KEYBOARD_KEYS];
BOOL keyIntervalInitials[KEYBOARD_KEYS];
BYTE keyIntervalTapStates[KEYBOARD_KEYS];
FLOAT keyIntervalTapTimes[KEYBOARD_KEYS];
static Keyboard* instance;
};
}
@@ -0,0 +1,9 @@
#include "KeyboardState.h"
namespace TLAC::Input
{
bool KeyboardState::IsDown(BYTE keycode)
{
return KeyStates[keycode];
}
}
@@ -0,0 +1,15 @@
#pragma once
#include <windows.h>
namespace TLAC::Input
{
const int KEYBOARD_KEYS = 0xFF;
struct KeyboardState
{
BYTE KeyStates[KEYBOARD_KEYS];
bool IsDown(BYTE keycode);
};
}