본문 바로가기
C++/WinAPI

[WinAPI] 키 입력 관리

by sihyeong 2022. 11. 15.

게임 로직의 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