ShovelingLife
A Game Programmer
ShovelingLife
전체 방문자
오늘
어제
  • 분류 전체보기 (1072)
    • 그래픽스 (57)
      • 공통 (19)
      • 수학 물리 (22)
      • OpenGL & Vulkan (1)
      • DirectX (14)
    • 게임엔진 (183)
      • Unreal (69)
      • Unity (103)
      • Cocos2D-X (3)
      • 개인 플젝 (8)
    • 코딩테스트 (221)
      • 공통 (7)
      • 프로그래머스 (22)
      • 백준 (162)
      • LeetCode (19)
      • HackerRank (2)
      • 코딩테스트 알고리즘 (8)
    • CS (235)
      • 공통 (21)
      • 네트워크 (44)
      • OS & 하드웨어 (55)
      • 자료구조 & 알고리즘 (98)
      • 디자인패턴 (6)
      • UML (4)
      • 데이터베이스 (7)
    • 프로그래밍 언어 (348)
      • C++ (167)
      • C# (90)
      • Java (9)
      • Python (33)
      • SQL (30)
      • JavaScript (8)
      • React (7)
    • 그 외 (9)
      • Math (5)
      • 일상 (5)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • Source Code 좌측 상단에 복사 버튼 추가 완료
  • 언리얼 엔진 C++ 빌드시간 단축 꿀팁
  • 게임 업계 코딩테스트 관련
  • 1인칭 시점으로 써내려가는 글들

인기 글

태그

  • 그래픽스
  • 포인터
  • 알고리즘
  • SQL
  • 티스토리챌린지
  • 클래스
  • C++
  • c#
  • 프로그래머스
  • 문자열
  • 백준
  • 언리얼
  • C
  • 파이썬
  • 유니티
  • Unity
  • 함수
  • 오블완
  • string
  • 배열

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ShovelingLife

A Game Programmer

[C] 키 입력받는 함수 GetAsyncKeyState, GetKeyState
프로그래밍 언어/C++

[C] 키 입력받는 함수 GetAsyncKeyState, GetKeyState

2024. 1. 13. 13:25

GetAsyncKeyState

SHORT GetAsyncKeyState(int vKey)

반환값은 SHORT형이고, 첫번째 인수로는 가상 키코드가 오며, 우리가 만약 VK_UP을 넘겨주면, 방향키 중 위를 가르키는 키가 눌려있나 눌려있지 않나 확인할 수 있다. (키가 눌려진 상태에서는 최상위 비트(0x8000)이 1이 되며,  처음 입력되었을 때는 0x8001 비트가 1이 된다.)

가상 키코드 모음

 

반환값은 아래와같이 4가지로 나뉜다.

 

이전에 누른 적이 없고 호출 시점에서 눌린 상태, 즉 키가 눌려진 시점에서 0x8000을 반환한다. 만약 이전에도 누른 적이 있고 호출 시점에서도 눌렸으면 0x8001을 반환한다. 이전에 키를 눌렀으면 0x0001을 반환하고, 눌리지 않았다면 0x0000을 반환한다.

GetAsyncKeyState(VK_UP) & 0x8000 코드의 의미) 0x8000과 GetAsyncKeyState 반환값을 AND 연산하는 이유는 정확한 시점에서 키의 상태를 확인하기 위함이다. 만약에 키를 눌러 GetAsyncKeyState 함수가 0x8000을 반환한다면 이를 0x8000으로 AND 연산하여 키가 눌렸을때는 0x8000이 나온다. 그러나 눌려진 적이 있으면 GetAsyncKeyState 함수는 0x0001을 반환한다. 0x0001에다 0x8000을 AND 연산하게되면 0이 나오게 된다. (만약에 AND 연산하지 않았을 경우에는 눌러진 적이 있는 상태도 참이 되어 동작을 수행할 것이다.) 

#include <stdio.h>
#include <windows.h>
#include <conio.h>

void GotoXY(int x, int y)
{
	COORD cur;
	cur.X = x, cur.Y = y;
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cur);
}

int main()
{
	int x = 0, y = 0;

	while (1)
	{
		GotoXY(x, y);
		putch('@');

		if (GetAsyncKeyState(VK_UP) & 0x8000)
			y--;

		if (GetAsyncKeyState(VK_DOWN) & 0x8000)
			y++;

		if (GetAsyncKeyState(VK_LEFT) & 0x8000)
			x--;

		if (GetAsyncKeyState(VK_RIGHT) & 0x8000)
			x++;

		Sleep(50);
	}
}

GetKeyState

SHORT GetKeyState(int nVirtKey)

GetKeyState도 반환되는 값은 SHORT형이며, 첫번째 인수도 가상 키코드가 온다. GetKeyState는 메세지 큐에 저장된 메시지에 따라 반환되는 값이 다르다. 만약에 우리가 A 키를 눌렀다는 메세지가 메세지 큐에 남아 처리되지 않을때 있을때, 키가 눌렸다고 출력될 것이다. 반대로 GetAsyncKeyState는 메세지 큐와 상관없이 입력되는 순간 즉각적으로 읽어들여 동작한다. GetKeyState 함수는 해당 키가 눌렸으면 음수값(0xffffff80, 0xffffff81)을 반환하고, 아닐 경우에는 0을 반환한다. 이것 역시 이전에 누른적이 있고, 호출 시점에서는 누르지 않았다면 계속 1로 남는다.

#include <stdio.h>
#include <windows.h>
#include <conio.h>

void GotoXY(int x, int y)
{
	COORD cur;
	cur.X = x, cur.Y = y;
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cur);
}

int main()
{
	int x = 0, y = 0;

	while (1)
	{
		GotoXY(x, y);
		putch('@');

		if (GetKeyState(VK_UP) & 0x8000)
			y--;

		if (GetKeyState(VK_DOWN) & 0x8000)
			y++;

		if (GetKeyState(VK_LEFT) & 0x8000)
			x--;

		if (GetKeyState(VK_RIGHT) & 0x8000)
			x++;

		Sleep(50);
	}
}

 

https://3dmpengines.tistory.com/1246

저작자표시 (새창열림)

'프로그래밍 언어 > C++' 카테고리의 다른 글

[C++] 구조체 바이트 패딩 규칙 코드 (structure byte padding or align rule)  (0) 2024.04.24
C++ 23 추가된 주요 기능들  (0) 2024.02.27
[C++] inline (인라인) 함수란  (0) 2023.12.21
[C++] 입출력 개요  (0) 2023.12.21
[C++] Iterator (반복자)  (0) 2023.12.19
    '프로그래밍 언어/C++' 카테고리의 다른 글
    • [C++] 구조체 바이트 패딩 규칙 코드 (structure byte padding or align rule)
    • C++ 23 추가된 주요 기능들
    • [C++] inline (인라인) 함수란
    • [C++] 입출력 개요
    ShovelingLife
    ShovelingLife
    Main skill stack => Unity C# / Unreal C++ Studying Front / BackEnd, Java Python

    티스토리툴바