티스토리 뷰
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
'C언어' 카테고리의 다른 글
c++ - typedef 키워드 사용방법 및 예시 (0) | 2021.05.15 |
---|---|
c++ - 윈도우 API 더블 버퍼링 구현(콘솔 깜빡임 문제 해결) (0) | 2021.04.23 |
C++ - 이길수 없는 틱택토 인공지능 만들기 (7) | 2021.04.14 |
C 제9강 - 함수 활용하기 (0) | 2020.02.19 |
C 제8강 - 배열 활용하기 (0) | 2020.02.17 |
- Total
- Today
- Yesterday
- 깃 용량문제
- 안드로이드 구글맵
- 젠킨스 에이전트 연결
- 젠킨스
- 백준
- Jenkins
- Add Node
- refusing to run with root privileges
- Connecting Jenkins
- 빌드 주기
- 언리얼 기초
- C++
- Connecting Jenkins Agent
- c언어 기초
- 깃 허브 오류 해결
- Jenkins Build Periodically
- Unreal Header Tool
- 알고리즘
- 구글맵
- 유니티
- 안드로이드
- 언리얼
- 유니티 직소퍼즐 구현
- UHT
- 언리얼 빌드
- 알고리즘기초
- dfs
- 언리얼 사용자 정의 구조체
- C언어기초
- c언어강의
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |