강의/C언어 게임 만들기

C언어로 게임 만들기 1. 기초 & 플레이어 움직이기 (1) 기초 함수들

moon44432 2020. 11. 11. 01:26

C언어로 게임 만들기
1. 기초 & 플레이어 움직이기
(1) 기초 함수들

반갑습니다. 본격적인 첫 강의입니다.
1장에서는 윈도우 콘솔 게임을 만들 때 쓰이는 기초 함수의 구현과, 플레이어를 움직이는 방법에 대해 설명합니다.

그중 (1)은 가장 중요한 기초 함수들에 대한 내용입니다.


gotoxy() 함수

우리가 만드는 게임은 텍스트 모드에서 돌아갑니다. 플레이어를 움직이라는 명령을 내리면, 먼저 터미널 위의 커서가 이동하고 그 위에 플레이어를 출력하게 됩니다. 이때, 커서의 위치를 지정된 좌표로 옮기는 함수가 gotoxy() 함수입니다. gotoxy(x좌표값, y좌표값); 의 형태로 사용합니다.

// WINAPI 버전

void gotoxy(int x, int y)
{
	COORD CursorPosition = {x, y};
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), CursorPosition);
}

 

윈도우 API 함수를 사용하는 버전입니다. 위 함수는 Windows.h를 먼저 인클루드해야 사용할 수 있습니다. 본 강의는 윈도우를 기준으로 하므로, 이후에는 계속 이 버전이 등장할 예정입니다.

// ANSI escape code 버전

void gotoxy(int x, int y)
{
	printf("\033[%d;%df", y, x);
}

 

ANSI 이스케이프 코드를 사용하는 버전입니다. 맥과 리눅스의 터미널에서 사용 가능하며, 윈도우 10의 최신 빌드에서도 작동됩니다. (옛 윈도우는 ANSI 이스케이프 코드를 지원하지 않습니다.) 맥 또는 리눅스 유저라면 이 버전을 대신 사용하세요.

ANSI 이스케이프 코드는 쉽게 말해 텍스트 터미널 상에서 커서의 위치, 글자 색상, 폰트 등을 조정하는 명령어들의 표준입니다. 더 자세한 내용은 이곳이곳을 참고하세요.

보통 윈도우의 콘솔은 동시에 가로 80개, 세로 25개의 문자를 출력할 수 있습니다. (윈도우 10은 이보다 더 넓지만, 강의에서는 80*25로 통일할 것입니다.) 따라서 좌측 상단 끝이 (0, 0), 우측 하단 끝이 (79, 24)가 됩니다. 이 점에 유의하시고, 다음 예제 코드를 통해 gotoxy()의 사용 방법을 파악해 보세요.

#include <stdio.h>
#include <Windows.h>

void gotoxy(int x, int y)
{
     COORD CursorPosition = { x, y };
     SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), CursorPosition);
}

int main(void)
{
     gotoxy(0, 0);
     printf("(0, 0) 좌표에 출력했습니다.");
     gotoxy(40, 12);
     printf("(40, 12) 좌표에 출력했습니다.");
     gotoxy(0, 24);
     printf("가장 밑줄에 출력했습니다.");
}

 

실행 결과는 다음과 같습니다.

 

setcursortype() 함수

게임을 개발하다 보면, 콘솔 창의 깜박거리는 커서가 불편해집니다.
아래의 setcursortype() 함수를 이용하면 커서를 숨기거나, 다시 나타내거나, 큰 커서로 바꿀 수도 있지만, 이 강의에서는 숨기고 나타내는 기능만 사용합니다.

다음 코드는 setcursortype() 함수 정의와, 그 함수에 사용되는 열거형의 정의입니다.

// WINAPI 버전

typedef enum { NOCURSOR, SOLIDCURSOR, NORMALCURSOR } CURSOR_TYPE;

void setcursortype(CURSOR_TYPE c)
{
     CONSOLE_CURSOR_INFO CurInfo;
     switch (c)
     {
     case NOCURSOR:
         CurInfo.dwSize = 1;
         CurInfo.bVisible=FALSE;
         break;
     case SOLIDCURSOR:
         CurInfo.dwSize = 100;
         CurInfo.bVisible = TRUE;
         break;
     case NORMALCURSOR:
         CurInfo.dwSize = 20;
         CurInfo.bVisible = TRUE;
         break;
     }
     SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&CurInfo);
}

 

위 코드도 gotoxy()와 마찬가지로 Windows.h를 인클루드해야 작동합니다.

아직 맥 및 리눅스 터미널에서 동작하는 만족스러운 대체재를 찾지 못했기 때문에, 안타깝지만 비 윈도우 유저들은 setcursortype()를 사용할 수 없습니다. 찾는 대로 업데이트하겠습니다. 커서가 있으면 성가시기는 하지만 큰 문제가 되지는 않기 때문에 일단 이 함수는 건너뛰세요.

다음 예제 코드로 실행 결과를 알아보세요.

#include <stdio.h>
#include <Windows.h>

typedef enum { NOCURSOR, SOLIDCURSOR, NORMALCURSOR } CURSOR_TYPE;
void setcursortype(CURSOR_TYPE c)
{
     CONSOLE_CURSOR_INFO CurInfo;
     switch (c)
     {
     case NOCURSOR:
         CurInfo.dwSize = 1;
         CurInfo.bVisible = FALSE;
         break;
     case SOLIDCURSOR:
         CurInfo.dwSize = 100;
         CurInfo.bVisible = TRUE;
         break;
     case NORMALCURSOR:
         CurInfo.dwSize = 20;
         CurInfo.bVisible = TRUE;
         break;
     }
     SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &CurInfo);
}

int main(void)
{
     setcursortype(NOCURSOR);
}

 

스크린샷은 올리지 않았습니다. 직접 실행해 보면, 커서가 사라진 것을 확인할 수 있습니다.


지금까지 게임을 만들 때에 필수적인 2개의 함수를 알아보았습니다. 오늘 설명한 함수 외에 기타 함수는 강의 도중에 소개하도록 하겠습니다.
다음 시간에는 플레이어를 움직이는 방법에 대해 알아보겠습니다.

이상으로 강의를 마칩니다. 감사합니다.

오류 신고나 문의사항은 댓글을 이용하세요.

1 ··· 3 4 5 6 7 8 9 10