#include "SDL.h"
namespace Input
{
class Keyboard
{
public:
class Key
{
public:
friend Keyboard;
enum Type
{
TYPE_UP,
TYPE_DOWN,
TYPE_LEFT,
TYPE_RIGHT,
TYPE_RETURN,
TYPE_ESCAPE,
TYPE_SPACE,
TYPE_A,
TYPE_B,
TYPE_C,
TYPE_F,
TYPE_M,
TYPE_N,
TYPE_S,
TYPE_V,
TYPE_W,
TYPE_Z,
TYPE_COUNT
};
private:
int state;
public:
bool isDown() const { return (state != 0); }
bool isHit() const { return (state == 1); }
Key() :
state(0)
{
}
};
private:
Key key[Key::TYPE_COUNT];
public:
Key getKey(Key::Type type) const { return key[type]; }
void handle(const SDL_Event sdl_event);
void initialize();
};
void Keyboard::handle(const SDL_Event sdl_event)
{
if (sdl_event.type == SDL_KEYDOWN || sdl_event.type == SDL_KEYUP)
{
int sdlkey_equivalent = 0;
for (auto sdlkey : { SDLK_UP, SDLK_DOWN, SDLK_LEFT, SDLK_RIGHT, SDLK_RETURN, SDLK_ESCAPE, SDLK_SPACE, SDLK_a, SDLK_b, SDLK_c, SDLK_f, SDLK_m, SDLK_n, SDLK_s, SDLK_v, SDLK_w, SDLK_z })
{
if (sdl_event.key.keysym.sym == sdlkey)
{
if (sdl_event.type == SDL_KEYDOWN)
{
key[sdlkey_equivalent].state = 1;
}
else if (sdl_event.type == SDL_KEYUP)
{
key[sdlkey_equivalent].state = 0;
}
}
++sdlkey_equivalent;
}
}
}
}
I2luY2x1ZGUgIlNETC5oIgoKbmFtZXNwYWNlIElucHV0CnsKCWNsYXNzIEtleWJvYXJkCiAgICB7CiAgICBwdWJsaWM6CiAgICAgICAgY2xhc3MgS2V5CiAgICAgICAgewogICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgZnJpZW5kIEtleWJvYXJkOwoKICAgICAgICAgICAgZW51bSBUeXBlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFRZUEVfVVAsCiAgICAgICAgICAgICAgICBUWVBFX0RPV04sCiAgICAgICAgICAgICAgICBUWVBFX0xFRlQsCiAgICAgICAgICAgICAgICBUWVBFX1JJR0hULAogICAgICAgICAgICAgICAgVFlQRV9SRVRVUk4sCiAgICAgICAgICAgICAgICBUWVBFX0VTQ0FQRSwKICAgICAgICAgICAgICAgIFRZUEVfU1BBQ0UsCiAgICAgICAgICAgICAgICBUWVBFX0EsCiAgICAgICAgICAgICAgICBUWVBFX0IsCiAgICAgICAgICAgICAgICBUWVBFX0MsCiAgICAgICAgICAgICAgICBUWVBFX0YsCiAgICAgICAgICAgICAgICBUWVBFX00sCiAgICAgICAgICAgICAgICBUWVBFX04sCiAgICAgICAgICAgICAgICBUWVBFX1MsCiAgICAgICAgICAgICAgICBUWVBFX1YsCiAgICAgICAgICAgICAgICBUWVBFX1csCiAgICAgICAgICAgICAgICBUWVBFX1osCiAgICAgICAgICAgICAgICBUWVBFX0NPVU5UCiAgICAgICAgICAgIH07CgogICAgICAgIHByaXZhdGU6CiAgICAgICAgICAgIGludCBzdGF0ZTsKCiAgICAgICAgcHVibGljOgogICAgICAgICAgICBib29sIGlzRG93bigpIGNvbnN0IHsgcmV0dXJuIChzdGF0ZSAhPSAwKTsgfQogICAgICAgICAgICBib29sIGlzSGl0KCkgIGNvbnN0IHsgcmV0dXJuIChzdGF0ZSA9PSAxKTsgfQoKICAgICAgICAgICAgS2V5KCkgOgogICAgICAgICAgICAgICAgICAgIHN0YXRlKDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgcHJpdmF0ZToKICAgICAgICBLZXkga2V5W0tleTo6VFlQRV9DT1VOVF07CgogICAgcHVibGljOgogICAgICAgIEtleSBnZXRLZXkoS2V5OjpUeXBlIHR5cGUpIGNvbnN0IHsgcmV0dXJuIGtleVt0eXBlXTsgfQoKICAgICAgICB2b2lkIGhhbmRsZShjb25zdCBTRExfRXZlbnQgc2RsX2V2ZW50KTsKICAgICAgICB2b2lkIGluaXRpYWxpemUoKTsKICAgIH07CiAgICAKICAgIHZvaWQgS2V5Ym9hcmQ6OmhhbmRsZShjb25zdCBTRExfRXZlbnQgc2RsX2V2ZW50KQogICAgewogICAgICAgIGlmIChzZGxfZXZlbnQudHlwZSA9PSBTRExfS0VZRE9XTiB8fCBzZGxfZXZlbnQudHlwZSA9PSBTRExfS0VZVVApCiAgICAgICAgewogICAgICAgICAgICBpbnQgc2Rsa2V5X2VxdWl2YWxlbnQgPSAwOwogICAgICAgICAgICBmb3IgKGF1dG8gc2Rsa2V5IDogeyBTRExLX1VQLCBTRExLX0RPV04sIFNETEtfTEVGVCwgU0RMS19SSUdIVCwgU0RMS19SRVRVUk4sIFNETEtfRVNDQVBFLCBTRExLX1NQQUNFLCBTRExLX2EsIFNETEtfYiwgU0RMS19jLCBTRExLX2YsIFNETEtfbSwgU0RMS19uLCBTRExLX3MsIFNETEtfdiwgU0RMS193LCBTRExLX3ogfSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHNkbF9ldmVudC5rZXkua2V5c3ltLnN5bSA9PSBzZGxrZXkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNkbF9ldmVudC50eXBlID09IFNETF9LRVlET1dOKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAga2V5W3NkbGtleV9lcXVpdmFsZW50XS5zdGF0ZSA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNkbF9ldmVudC50eXBlID09IFNETF9LRVlVUCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGtleVtzZGxrZXlfZXF1aXZhbGVudF0uc3RhdGUgPSAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICsrc2Rsa2V5X2VxdWl2YWxlbnQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0K