#define GK_NULL 0
#define GK_W (1<<0)
#define GK_S (1<<1)
#define GK_A (1<<2)
#define GK_D (1<<3)
#define GK_J (1<<4)
#define GK_K (1<<5)
int g_iKeyState = GK_NULL;
void(*pListeners[10])(char keycode);
short VK2GK(char keyCode)
{
switch (keyCode)
{
case 'W':
case 'w':
return GK_W;
case 'D':
case 'd':
return GK_D;
case 'A':
case 'a':
return GK_A;
case 'S':
case 's':
return GK_S;
case 'J':
case 'j':
return GK_J;
case 'K':
case 'k':
return GK_K;
default:
return GK_NULL;
}
}
bool IsKeyDown(int gk)
{
return g_iKeyState & gk;
}
void OnKeyDown(char keycode)
{
cout << keycode << "按下" << endl;
g_iKeyState |= VK2GK(keycode);
}
void OnKeyUp(char keycode)
{
cout << keycode << "抬起" << endl;
g_iKeyState &= ~VK2GK(keycode);
}
int RegistKeyFun(void(*pListeners[10])(char keycode),void(*pF)(char keycode))
{
static int iD = 0;
pListeners[iD++] = pF;
return iD - 1;
}
void NotifyKey(void(*pListeners[10])(char keycode), int funID, int keycode)
{
pListeners[funID](keycode);
}
void main()
{
int keyDown = RegistKeyFun(pListeners, OnKeyDown);
int keyUp = RegistKeyFun(pListeners, OnKeyUp);
NotifyKey(pListeners, keyDown, 'a');
NotifyKey(pListeners, keyDown, 'J');
if (IsKeyDown(GK_A) && IsKeyDown(GK_J))
{
cout << "a和j被同时按下" << endl;
}
NotifyKey(pListeners, keyUp, 'A');
if (!IsKeyDown(GK_A))
{
cout << "a抬起" << endl;
}
}