Clean up
This commit is contained in:
@@ -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);
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user