History: Auto Repeat Key Input
Source of version: 3 (current)
Copy to clipboard
{maketoc}
!!AutoRepeatKey.h
{CODE(wrap="1", colors="c++")}#pragma once
#include <OIS.h>
class AutoRepeatKey {
private:
OIS::KeyCode m_nKey;
unsigned int m_nChar;
float m_fElapsed;
float m_fDelay;
float m_fRepeatDelay;
float m_fInitialDelay;
protected:
virtual void repeatKey(OIS::KeyCode a_nKey, unsigned int a_nChar) = 0;
public:
AutoRepeatKey(float a_fRepeatDelay = 0.035f, float a_fInitialDelay = 0.300f);
void begin(const OIS::KeyEvent &evt);
void end(const OIS::KeyEvent &evt);
void update(float a_fElapsed); // Elapsed time in seconds
};{CODE}
!!AutoRepeatKey.cpp
{CODE(wrap="1", colors="c++")}#include "AutoRepeatKey.h"
AutoRepeatKey::AutoRepeatKey(float a_fRepeatDelay, float a_fInitialDelay):
m_nKey(OIS::KC_UNASSIGNED),
m_fRepeatDelay(a_fRepeatDelay),
m_fInitialDelay(a_fInitialDelay)
{}
void AutoRepeatKey::begin(const OIS::KeyEvent &evt) {
m_nKey = evt.key;
m_nChar = evt.text;
m_fElapsed = 0;
m_fDelay = m_fInitialDelay;
}
void AutoRepeatKey::end(const OIS::KeyEvent &evt) {
if (m_nKey != evt.key) return;
m_nKey = OIS::KC_UNASSIGNED;
}
void AutoRepeatKey::update(float a_fElapsed) {
if (m_nKey == OIS::KC_UNASSIGNED) return;
m_fElapsed += a_fElapsed;
if (m_fElapsed < m_fDelay) return;
m_fElapsed -= m_fDelay;
m_fDelay = m_fRepeatDelay;
do {
repeatKey(m_nKey, m_nChar);
m_fElapsed -= m_fRepeatDelay;
} while (m_fElapsed >= m_fRepeatDelay);
m_fElapsed = 0;
}{CODE}