안녕하세요. BlockDMask 입니다.
C++ 게임 혹은 C언어로 만드는 간단한 콘솔게임에서 자주 쓰이는 함수들을 정리해봤습니다.
제 블로그 카테고리에 있는 콘솔 게임들에서 모두 아래의 함수들을 사용하고 있어서, 이번 페이지에 한번 정리를 해보았습니다.
<목차>
1. 커서 이동을 위한 gotoxy 함수
2. 입력을 받는 _getch() 함수 사용방법
3. 위아래 이동 판단 로직
1. gotoxy() 함수
▶ C/C++ gotoxy 함수
#include<Windows.h>
우리가 만든 프로젝트를 실행하게 되면 창이 하나 나오게 되는데요, 일반적으로 윈도우 창을 따로 실행시키지 않는이상 콘솔창이 나오게 됩니다.
콘솔 창에 깜빡깜빡 하는 " _ " 이렇게 생긴것을 커서라고 하는데요, 이 커서를 우리가 창 안에서 자유자재로 위치시키기 위한 함수 입니다.
정리 : gotoxy 함수는 커서를 특정 위치로 이동시키기 위한 함수 입니다.
void gotoxy(int x, int y)
{
COORD Pos; //x, y를 가지고 있는 구조체
Pos.X = 2 * x;
Pos.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);
}
gotoxy 함수를 정의 할때 매개변수 x, y를 받도록 합니다. 우리가 사용할떄는 1,1로 가고싶다 이럴때 gotoxy(1,1) 이런식으로 사용할수 있도록 말이죠.
COORD 라는 구조체는 x, y 위치를 가지고 있는 구조체 입니다. 이 구조체 변수를 만들어서 x와 y를 채워 넣어 줍니다.
2*x를 넣어주는 이유는 커서가 1씩 이동하는것보다 2씩 이동하는게 더 자연스러워 보이기 때문에 2*x를 넣어줍니다.
SetConsoleCursorPosition 함수는 이름에서 알수 있듯이 콘솔의 커서 위치를 알려주는 함수 입니다.
첫번째 매개변수로는 화면 출력 핸들러 GetStdHandle(STD_OUTPUT_HANDLE)를 넣어주고
두번째 매개변수로는 위치를 나타내는 COORD 타입 변수인 Pos를 넣어줍니다.
첫번째 매개변수에는 을 넣습니다. STD_OUTPUT_HANDLE은 윈도우 베이스의 기본 출력을 뜻하는 매크로 이고, 그 매크로에 해당하는 핸들러를 GetStdHandle()로 받아옵니다. 이거는 그냥 "아 출력용 핸들러를 가지고 오는거구나" 하면 될것같습니다.
이렇게 커서를 이동시키는 함수를 완성했습니다.
2. 키보드 입력을 가지고 오는 _getch() 함수
▶ C/C++ _getch() 함수
#include<conio.h>
_getch() 함수는 사용자가 입력한 키에 대한 값을 아스키코드로 반환해주는 함수 입니다. (int 타입으로)
우리는 이걸 이용해서 사용자가 입력한 것에대한 것을 읽고 프로그램은 그에 맞는 동작을 하도록 할 것 입니다.
먼저 알아두어야 할 것은 아스키 코드 표를 보면 키보드 상하좌우에 대한 값이 나와있지 않습니다. (두둥.)
그럼 _getch()에서 키보드 화살표를 인식하지 못하는 걸까요?
아니겠죠..?
키보드에 입력이 →←↓↑ 키들이 오면 아스키 코드표에서는 표기할 수 없기 때문에 특별히 _getch()가 두번 출력을 하는데요.
224 를 뱉고 그 다음에 해당 키에 맞는 숫자를 뱉습니다.
정리하면 이렇습니다.
↑ : 224 -> 72
← : 224 -> 75
→ : 224 -> 77
↓ : 224 -> 80
코드에서 쉽게 사용하기 위해서 프로젝트에서는 enum과 메크로로 선언해두었습니다.
#define MAGIC_KEY 224 //상하좌우 화살표가 들어올때 선행되어 들어오는 숫자
#define SPACE 32 //스페이스 키 값
enum KEYBOARD
{
UP = 72,
LEFT = 75,
RIGHT = 77,
DOWN = 80
};
3. 메뉴에서 위아래 이동 판단 로직
키보드 입력을 받는 _getch() 함수와 커서를 이동시키는 gotoxy 함수를 이용해서 메뉴판 위아래로 움직이는 로직을 짜보자.
MENU ReadyGame()
{
int y = 0; //위아래로 움직일 좌표
int input = 0; //키보드 입력을 받을 변수
while (true) //게임 루프
{
input = _getch(); //키보드 입력을 받았다.
//→←↑↓
if (input == MAGIC_KEY) //받았는데 224네?
{
switch (_getch()) //그럼 한번더 받아보자 상하좌우 일수 있으니.
{
case UP: //위
--y;
break;
case DOWN: //아래
++y;
break;
}
}
}
}
자 함수를 살펴보면 y가 이제 커서의 위치를 나타내는 곳이고, gotoxy로 위치를 계속 받고 있습니다.
그리고 _getch()를 이용해서 y의 위치를 ++, -- 하거나 해도 됩니다.
좌우가 필요하면 LEFT, RIGHT 를 이용해서 x값을 추가해도 되겠죠?
어렵진 않으시죠? 충분히 분석해보신 후에도 코드가 이해가지 않는다면 댓글로 질문 남겨주세요.
'<토이프로젝트> > [C++ 게임]' 카테고리의 다른 글
[C++ 게임] 리듬 게임 만들기 (화살표 똑같이 입력하기게임) (10) | 2020.07.24 |
---|---|
[C++ 게임] 짝 맞추기 게임 (Card Matching) (4) | 2020.06.03 |
[C++ 게임] 행맨 게임 프로그래밍 (4) | 2019.11.27 |