For me
[DirectX12] 5) Input 본문
Input 클래스는 키보드의 입력, 마우스의 클릭을 입력받기 위해 작성했다.
Input.h
#pragma once
enum class KEY_TYPE
{
UP = VK_UP,
DOWN = VK_DOWN,
LEFT = VK_LEFT,
RIGHT = VK_RIGHT,
LBUTTON = VK_LBUTTON,
RBUTTON = VK_RBUTTON,
};
enum class KEY_STATE
{
NONE,
PRESS,
DOWN,
UP,
END
};
enum
{
KEY_TYPE_COUNT = static_cast<int32>(UINT8_MAX + 1),
KEY_STATE_COUNT = static_cast<int32>(KEY_STATE::END),
};
class Input
{
DECLARE_SINGLE(Input);
public:
void Init(HWND hwnd);
void Update();
// 누르고 있을 때
bool GetButton(KEY_TYPE key) { return GetState(key) == KEY_STATE::PRESS; }
// 맨 처음 눌렀을 때
bool GetButtonDown(KEY_TYPE key) { return GetState(key) == KEY_STATE::DOWN; }
// 맨 처음 눌렀다 뗐을 때
bool GetButtonUp(KEY_TYPE key) { return GetState(key) == KEY_STATE::UP; }
const POINT& GetMousePos() { return _mousePos; }
private:
inline KEY_STATE GetState(KEY_TYPE key) { return _states[static_cast<uint8>(key)]; }
private:
HWND _hwnd;
vector<KEY_STATE> _states;
POINT _mousePos = {};
};
Input.cpp
#include "Input.h"
#include "Engine.h"
void Input::Init(HWND hwnd)
{
_hwnd = hwnd;
_states.resize(KEY_TYPE_COUNT, KEY_STATE::NONE);
}
void Input::Update()
{
HWND hwnd = ::GetActiveWindow();
if (_hwnd != hwnd)
{
for (uint32 key = 0; key < KEY_TYPE_COUNT; key++)
_states[key] = KEY_STATE::NONE;
return;
}
BYTE asciiKeys[KEY_TYPE_COUNT] = {};
if (::GetKeyboardState(asciiKeys) == false)
return;
for (uint32 key = 0; key < KEY_TYPE_COUNT; key++)
{
// 키가 눌려 있으면 true
if (asciiKeys[key] & 0x80)
{
KEY_STATE& state = _states[key];
// 이전 프레임에 키를 누른 상태라면 PRESS
if (state == KEY_STATE::PRESS || state == KEY_STATE::DOWN)
state = KEY_STATE::PRESS;
else
state = KEY_STATE::DOWN;
}
else
{
KEY_STATE& state = _states[key];
// 이전 프레임에 키를 누른 상태라면 UP
if (state == KEY_STATE::PRESS || state == KEY_STATE::DOWN)
state = KEY_STATE::UP;
else
state = KEY_STATE::NONE;
}
}
::GetCursorPos(&_mousePos);
::ScreenToClient(GEngine->GetWindow().hwnd, &_mousePos);
}
Unity와 비슷하도록 구현된 Input 클래스
'DirectX12' 카테고리의 다른 글
[DirectX12] 7) Component (0) | 2023.01.16 |
---|---|
[DirectX12] 6) Timer (0) | 2023.01.15 |
[DirectX12] 4) Texture Mapping (0) | 2023.01.15 |
[DirectX12] 3) DirectX12 초기화 - 2 (0) | 2023.01.15 |
[DirectX12] 2) DirectX12 초기화 (0) | 2023.01.14 |