게임 로직의 GetAsyncKeyState()의 문제점
- 동일 프레임에서 먼저 실생하는 로직에서 입력을 받아 true가 나오고 뒷부분의 처리엔 키를 누르지 않아 false가 나오는 등의 동기화 문제가 생길 수 있다.
- KeyDown, KeyHold, KeyUp을 판단하려면 추가적인 코드를 써야 판단이 가능하고 키 입력 판단 할 때마다 코드를 적어야 하니까 불편함
- 비동기적으로 처리되어 윈도우가 포커싱되어 있지 않아도 동작한다. (최소화 상태에서도 동작함)
KeyManager를 따로 생성하여 관리하여 위의 문제점들을 해결한다.
- KeyManager에서 키 입력을 판단하고 그 값을 통해 동작하도록 한다.
- 키값에 해당하는 배열을 매칭해서 Down, Hold, UP 쉽게 판단 가능
- 포커싱 x 상태의 경우도 일괄로 처리하도록 가능
enum class KEY_STATE
{
NONE, // 눌리지 않았고, 이전에도 눌리지 않은 상태
TAP, // down
HOLD, // press
AWAY, // up
};
struct tKeyInfo
{
KEY_STATE eState; // 키의 상태값
bool bPrevPush; // 이전 프레임에서 눌렸는지 여부
};
vector<tKeyInfo> m_vecKey;
- 현재 키 상태, 이전 프레임에서 눌렀는지 여부 등을 통해 관리한다.
- vector에 enum으로 키에대해 매핑해서 m_vecKey[KEY::LEFT]; 이런 식으로 접근 할 수 있게 관리하면 편하다.
- KEY_STATE로 keyDown, KeyHold, KeyUp을 표현할 수 있다.
HWND hWnd = GetFocus();
- GetFocus()가 nullptr을 반환하면 어떠한 윈도우도 포커싱되어있지 않다는 것을 의미하고 이때 처리를 해줘야 백그라운드에서도 키입력을 받아 처리하지 않도록 할 수 있다.
- TAP, HOLD상태에서 바로 NONE 상태로 전환하면 KeyUp 처리를 하지 않아서 비 정상적인 동작을 할 수 있으니
- 포커스가 없어지면 TAP과 HOLD는 AWAY로 변경하고 AWAY는 NONE으로 변경하여 비 정상적인 흐름을 제어한다.
'C++ > WinAPI' 카테고리의 다른 글
[WinAPI] sound (0) | 2022.12.17 |
---|---|
[WinAPI] DC, BITMAP, 더블버퍼링 (0) | 2022.11.15 |
[WinAPI] 윈도우 크기 지정 (0) | 2022.11.15 |
[WinAPI] 그리기 (0) | 2022.11.13 |
[WinAPI] Win32API 기본 (0) | 2022.11.13 |