티스토리 뷰

728x90

1.서론

콘솔을 통해 게임 혹은 기타 프로그램을 만들 때 cin 으로 입력을 받을 경우 입력 후 엔터키를 눌러야 입력처리가 완료됩니다. 하지만 게임 같은 경우 방향키나 특정 키를 눌렀을 때 그 결과를 즉시 반영해야 하므로 키보드를 누를때마다 엔터를 눌러야하는건 부자연스러운 일이죠.

 

그래서 이번에는 사용자의 키보드 입력을 엔터없이 즉시 받아내고 처리하는 방법을 알아보겠습니다.

 

2.구현

먼저 헤더파일 #include <conio.h>를 포함 시켜줍니다. 그리고 다음과 같이 함수를 정의해줍니다.

int getCommand() {
	if (_kbhit()) {
		return _getch();
	}

	return -1;
}

_kbhit() 함수는 윈도우 라이브러리로 현재 키보드가 눌렸는지 여부를 bool형으로 반환 해주는 함수입니다.

_getch()는 키보드의 키 1개를 사용자로부터 입력받는 함수입니다.

 

여기서 _kbhit()을 써줘야 하는 이유는 사용자가 입력을 하지 않더라도 계속해서 프로그램이 진행되어야 하기 때문입니다. 게임의 경우 사용자가 아무런 키를 입력하지 않아도 지속적으로 게임상태가 변화되어야 합니다. 하지만 _kbhit()을 쓰지 않을 경우 _getch()함수에서 사용자의 입력이 있을때까지 기다리게 되며 사용자가 키를 입력하지 않으면 게임은 진행되지 않게 됩니다.

 

그래서 _kbhit()을 통해 키보드가 눌려있을 경우에만 사용자로부터 _getch()를 통해 입력을 받고 그렇지 않을 경우 -1을 반환해 입력을 기다리지 않고 넘어가도록 합니다.

 

이제 이 getCommand()함수를 게임의 무한루프 함수내부에서 반복적으로 호출해주면서 게임의 내용을 구성하는 렌더링함수나 Update()함수등을 호출해주면 엔터없이 실시간으로 사용자의 입력을 받을 수 있습니다.

 

마지막으로 아스키코드값 이미지를 첨부하고 포스팅을 마치겠습니다.

아스키 코드표에 없는 방향키의 경우 _getch()함수가 값 2개를 반환하게 되는데 첫번째로 224를 반환하고 두번째로

위화살표 : 72

오른쪽 : 77

아래 : 80

왼쪽 : 75

값을 반환합니다.

 

만약 switch case를 통해 입력을 처리한다면 224가 반환될경우 아무런 동작을 하지 않을테니 특별한 예외처리를 해줄 필요는 없을겁니다.

 

궁금한점은 댓글로 질문 남겨주시고 빠른 답변을 원하시면 오픈 카카오톡을 이용해주세요.

도움이 되셨다면 좋아요 꼭 부탁드립니다~!

 

오픈 카카오톡 주소 : open.kakao.com/o/gDlTpJpc

댓글