0. 서론
컴퓨터가 발전하고 여러가지 입출력 장치가 생겨났습니다.
오늘 살펴볼 것은 강력한 입력 장치 중 하나인 키보드를 활용한 방법입니다.
1. getch()를 통한 키값 확인
위의 사진 처럼 키보드로 입력할 경우 키보드에 해당하는 문자를 출력하고 입력값이 얼마인지 출력하도록 했습니다.
ESC키를 누르게 되면 프로그램은 종료를 합니다.
다만 재미있는 점은 아래와 같습니다.
먼저, 위의 출력을 먼저 살펴보겠습니다.
? 224 이후 H: 72 와 같은 패턴으로 4가지가 나옵니다.
이는 방향키에 대한 출력입니다.
방향키를 비롯한 몇몇 입력들은 1바이트로 처리되는 아스키코드와 다르게 확장 아스키 코드를 사용하기 때문에 저렇게 두번의 변환을 통하여 표현됩니다.
아래의 : 0 이후 ; : 59와 같은 패턴은 F1~F5번을 입력했을 때 나타나는 결과입니다.
이를 통하여 우리는 일반적인 키보드 입력을 처리하는 방법과 특수한 키를 처리하는 방법 두가지를 익혔습니다.
위의 사진에서 사용한 코드는 아래와 같습니다.
#include<iostream>
#include<conio.h>
using namespace std;
/* 키입력 테스트 */
int main(void) {
int key;
while (1) {
key = _getch();
cout << (char)key << ": " << key << endl;
if (key == 27) {
cout << "ESC";
break;
}
}
}
2. kbhit()을 통한 입력 확인
kbhit()은 키 입력이 있는지 없는지 확인하는 함수입니다.
getch()는 키 입력이 생길 때 까지 기다리는 반면,
kbhit()은 입력버퍼를 확인하여 당장에 있으면 true, 없으면 false를 반환하는 함수입니다.
즉, 기다림이 없습니다.
쉽게 표현하자면 getch()은 내가 무언가를 입력해야 다음으로 진행하기 때문에 턴제 게임,
kbhit()은 입력이 있으면 하고 없으면 안하는 실시간 게임과 같은 효과를 줍니다.
kbhit()이 얼마나 중요성이 이제 실감이 나실까요?
다음의 캡처를 살펴보겠습니다.
위의 코드에서 while문이 시작할 때 "while문 시작.."이라는 문자열만 출력하도록 추가했습니다.
내가 무언가 입력을 해야만 다음 단계로 처리가 이루어집니다.
여기서 kbhit()을 이용하여 코드를 수정해보겠습니다.
#include<iostream>
#include<Windows.h> // Sleep() 함수를 사용하기 위하여 추가
#include<conio.h>
using namespace std;
/* kbhit을 추가한 키입력 테스트 */
int main(void) {
int key;
while (1) {
if (_kbhit()) {
key = _getch();
cout << (char)key << ": " << key << endl;
if (key == 27) {
cout << "ESC";
break;
}
}
else {
cout << "입력대기...\n";
Sleep(100); //Sleep을 넣지 않으면 너무 빨라 확인하기 힘들다.
}
}
}
while문 아래에 if문을 추가하여 키보드 입력이 있으면 이전과 같이 입력 값을 출력하도록 하고,
만약 입력이 없다면 "입력대기..."라는 문자열을 출력하도록 만들었습니다.
실행해본다면 다음과 같이 나타납니다.
kbhit() 이 없었을 경우에는 입력을 하지 않으면 함수의 흐름 또한 멈춥니다.
kbhit()을 넣었을 때는 입력을 하지 않아도 프로그램은 다른 작업을 계속 수행하며 함수가 흘러갑니다.
3. 정리
우리는 getch()를 통하여 키보드 입력을 처리하는 방법과,
kbhit()을 통하여 실시간 상호작용을 할 수 있는 기반을 다졌습니다!
참고로 kbhit은 KeyBoard hit의 줄임말이라고 합니다.
함수를 기억할 때 도움이 되셨으면 좋겠네요.
'게임 프로젝트 > 기본기' 카테고리의 다른 글
gotoxy(), getch(), kbhit()을 이용간단한 게임만들기 (0) | 2021.07.19 |
---|---|
커서이동 gotoxy 함수와 입력대기 (0) | 2021.06.27 |