Skip to main content
Had forgotten to had the key pressed once part at first, so added key pressed
Source Link
struct Key
{
    bool down;
    bool released;
    bool pressed;
};
bool KeyInput::IsKeyDown(uint32 keyCode)
{
    return s_keys[keyCode].down;
}

bool KeyInput::WasKeyPressed(uint32 keyCode)
{
    return s_keys[keyCode].pressed;
}
bool KeyInput::WasKeyReleased(uint32 keyCode)
{
    return s_keys[keyCode].released;
}

void KeyInput::SetKey(uint32 keyCode, bool isDown, bool isReleased, bool isPressed)
{
    s_keys[keyCode].down = isDown;
    s_keys[keyCode].released = isReleased;
    s_keys[keyCode].pressed = isPressed;
}

void KeyInput::ResetKeyReleasedResetKeys()
{
    for (int i = 0; i < NUM_KEYS; i++)
    {
        s_keys[i].released = false;
        s_keys[i].pressed = false;
    }
}
case WM_KEYUP:
{
    bool wasDown = ((lParam & (1 << 30)) != 0);
    KeyInput::SetKey(wParam, false, wasDown, false);
}
break;
case WM_KEYDOWN:
{
    bool wasDown = ((lParam & (1 << 30)) != 0);
    bool isDown = ((lParam & (1 << 31)) == 0);
    KeyInput::SetKey(wParam, trueisDown, false, !wasDown && isDown);
}
break;
        while (g_running)
        {
            KeyInput::ResetKeyReleased();

            MSG message;
            while (PeekMessage(&message, 0, 0, 0, PM_REMOVE))
            {
                if (message.message == WM_QUIT)
                    g_running = false;
                TranslateMessage(&message);
                DispatchMessageA(&message);
            }

            if (KeyInput::IsKeyDown('W'))
                OutputDebugStringA("W is down\n");
            if (KeyInput::WasKeyReleased(VK_SPACE))
                OutputDebugStringA("SPACE was just released\n");
            if (KeyInput::WasKeyPressed('G'))
                OutputDebugStringA("G was just pressed\n");
        }
struct Key
{
    bool down;
    bool released;
};
bool KeyInput::IsKeyDown(uint32 keyCode)
{
    return s_keys[keyCode].down;
}

bool KeyInput::WasKeyReleased(uint32 keyCode)
{
    return s_keys[keyCode].released;
}

void KeyInput::SetKey(uint32 keyCode, bool isDown, bool isReleased)
{
    s_keys[keyCode].down = isDown;
    s_keys[keyCode].released = isReleased;
}

void KeyInput::ResetKeyReleased()
{
    for (int i = 0; i < NUM_KEYS; i++)
        s_keys[i].released = false;
}
case WM_KEYUP:
{
    bool wasDown = ((lParam & (1 << 30)) != 0);
    KeyInput::SetKey(wParam, false, wasDown);
}
break;
case WM_KEYDOWN:
{
    KeyInput::SetKey(wParam, true, false);
}
break;
        while (g_running)
        {
            KeyInput::ResetKeyReleased();

            MSG message;
            while (PeekMessage(&message, 0, 0, 0, PM_REMOVE))
            {
                if (message.message == WM_QUIT)
                    g_running = false;
                TranslateMessage(&message);
                DispatchMessageA(&message);
            }

            if (KeyInput::IsKeyDown('W'))
                OutputDebugStringA("W is down\n");
            if (KeyInput::WasKeyReleased(VK_SPACE))
                OutputDebugStringA("SPACE was just released\n");
        }
struct Key
{
    bool down;
    bool released;
    bool pressed;
};
bool KeyInput::IsKeyDown(uint32 keyCode)
{
    return s_keys[keyCode].down;
}

bool KeyInput::WasKeyPressed(uint32 keyCode)
{
    return s_keys[keyCode].pressed;
}
bool KeyInput::WasKeyReleased(uint32 keyCode)
{
    return s_keys[keyCode].released;
}

void KeyInput::SetKey(uint32 keyCode, bool isDown, bool isReleased, bool isPressed)
{
    s_keys[keyCode].down = isDown;
    s_keys[keyCode].released = isReleased;
    s_keys[keyCode].pressed = isPressed;
}

void KeyInput::ResetKeys()
{
    for (int i = 0; i < NUM_KEYS; i++)
    {
        s_keys[i].released = false;
        s_keys[i].pressed = false;
    }
}
case WM_KEYUP:
{
    bool wasDown = ((lParam & (1 << 30)) != 0);
    KeyInput::SetKey(wParam, false, wasDown, false);
}
break;
case WM_KEYDOWN:
{
    bool wasDown = ((lParam & (1 << 30)) != 0);
    bool isDown = ((lParam & (1 << 31)) == 0);
    KeyInput::SetKey(wParam, isDown, false, !wasDown && isDown);
}
break;
        while (g_running)
        {
            KeyInput::ResetKeyReleased();

            MSG message;
            while (PeekMessage(&message, 0, 0, 0, PM_REMOVE))
            {
                if (message.message == WM_QUIT)
                    g_running = false;
                TranslateMessage(&message);
                DispatchMessageA(&message);
            }

            if (KeyInput::IsKeyDown('W'))
                OutputDebugStringA("W is down\n");
            if (KeyInput::WasKeyReleased(VK_SPACE))
                OutputDebugStringA("SPACE was just released\n");
            if (KeyInput::WasKeyPressed('G'))
                OutputDebugStringA("G was just pressed\n");
        }
Source Link

What you can do is store boolean values for if the key was down or released and create some simple getters, a setter, and a "resetter" like so:

struct Key
{
    bool down;
    bool released;
};
bool KeyInput::IsKeyDown(uint32 keyCode)
{
    return s_keys[keyCode].down;
}

bool KeyInput::WasKeyReleased(uint32 keyCode)
{
    return s_keys[keyCode].released;
}

void KeyInput::SetKey(uint32 keyCode, bool isDown, bool isReleased)
{
    s_keys[keyCode].down = isDown;
    s_keys[keyCode].released = isReleased;
}

void KeyInput::ResetKeyReleased()
{
    for (int i = 0; i < NUM_KEYS; i++)
        s_keys[i].released = false;
}

Then in your WM_KEYDOWN and KEYUP handles:

case WM_KEYUP:
{
    bool wasDown = ((lParam & (1 << 30)) != 0);
    KeyInput::SetKey(wParam, false, wasDown);
}
break;
case WM_KEYDOWN:
{
    KeyInput::SetKey(wParam, true, false);
}
break;

And then finally before you handle the messages you call the reset function, and everything after your message handling would be your game loop, so something like:

        while (g_running)
        {
            KeyInput::ResetKeyReleased();

            MSG message;
            while (PeekMessage(&message, 0, 0, 0, PM_REMOVE))
            {
                if (message.message == WM_QUIT)
                    g_running = false;
                TranslateMessage(&message);
                DispatchMessageA(&message);
            }

            if (KeyInput::IsKeyDown('W'))
                OutputDebugStringA("W is down\n");
            if (KeyInput::WasKeyReleased(VK_SPACE))
                OutputDebugStringA("SPACE was just released\n");
        }

Hopefully this helped someone!