본문 바로가기
코딩/C, C++

C언어로 게임 만들기(1) - (콘솔창 세팅, window.h, conio.h)

by JuBro 2023. 5. 13.

학교 동아리 프로젝트에서 C언어로 게임만들기를 하고 있어서 한번 게임을 만들어보려고 한다.

 

내가 만들고 싶은 게임은 2D 종스크롤 슈팅게임을 만들어보고싶다.

이런 비행기 타고 탄막 쏘는 게임들

 

 

 

 

 

일단 필요한 기능들을 도식화 해봤다

이렇듯 필요한 기능들을 정리해두고,

 

이 기능전에 제일 먼저 콘솔창을 세팅해보자!!

 

 

 

windows.h

C 프로그래밍 언어에서 window.h는 Windows API(응용 프로그램 프로그래밍 인터페이스)의 함수들을 포함하는 C 및 C++ 헤더파일이다.

 

<대표적인 활용법>

  • 창 및 메세지 처리 : 새 창 만들기, 창 업데이트, 
  • 이벤트 처리 : 어쩌면 가장 많이 쓸수도 있는 키보드, 마우스 입력 이벤트 다루기, 창 크기 다루기 등등
  • 그래픽 및 드로잉 : 함수 및 도형 그리기 가능
  • 창 클래스 : 윈도우 클래스 등록, 속성정의

 

 

 

conio.h

console input/output의 줄임말으로써, 보다 편리하고 간단하게 콘솔기반 입력 및 출력 작업을 수행할 수 있는 함수 및 상수가 포함된 헤더파일이다.

 

 

<대표적인 기능들>

  • 텍스트 출력 기능 : printf, puts, cprintf 등을 이용해 콘솔 화면에 텍스트 및 형식화된 출력을 표시한다. 
  • 텍스트 입력 기능 : getch, getche, csancf 등을 이용해 개별 문자 또는 문자열을 읽는다.
  • 커서 제어 기능 : gotoxy, clrscr, textcolor 등을 이용해 콘솔화면을 지우거나 텍스트 색상을 변경한다.
  • 키보드 입력 기능 : getch, kbhit등을 이용해 키보드 키 누름을 인식

 

 

 

 

 

이 windows 및 conio 헤더파일을 이용해서 콘솔창을 세팅할것이다.

 

 

코딩시작!

 

콘솔창 크기 세팅
//콘솔 창의 크기와 제목을 지정하는 함수
void SetConsole() {
	system("title Flight Game"); // 콘솔창 이름 설정
	system("mode con:cols=60 lines=100"); // 콘솔창 크기설정

	CONSOLE_CURSOR_INFO ConsoleCursor;
	ConsoleCursor.bVisible = 0;
	ConsoleCursor.dwSize = 1;
	HANDLE consoleHandle = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleCursorInfo(consoleHandle, &ConsoleCursor);
}

 

다음은 콘솔창을 세팅하는(처음 초기화) 함수이다.

 

CONSOLE_CURSOR_INFO는 Windows 콘솔 응용 프로그램에서 콘솔 커서의 모양과 동작을 제어하는 ​​데 사용되는 구조이다.

1. dwSize : 콘솔창에서 커서가 차지하는 문자 셀의 배분률을 지정한다. 1~100사이 값이며 값이 100이면 커서가 전체 문자 셀을 차지한다. 1일수록 커서가 최소크기가 된다.

2. bVisivle : 커서의 가시성을 결정한다. TRUE or FALSE로 설정하며, TRUE면 보이고, FALSE면 안보인다.

 

제일 밑에 두줄 HANDLE ~ SetConsole~이 두 줄은 그냥 window API에서 콘솔 핸들러를 가져와서 설정한것이다.

 

 

 

텍스트 색깔 정하기
void textcolor(int color_number) {
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color_number);
}

단순한 이 한줄만 있으면 되고 색상표는 다음과 같다.

숫자 글자색 숫자 글자색
0 검정색 8 회색
1 파란색 9 연한 파란색
2 초록색 10 연한 초록색
3 옥색 11 연한 옥색
4 빨간색 12 연한 빨간색
5 자주색 13 연한 자주색
6 노란색 14 연한 노란색
7 흰색 15 진한 흰색

 

 

 

 

커서 움직임
void gotoxy(int x, int y) {
	HANDLE consoleHandle = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD Cur;
	Cur.X = x;
	Cur.Y = y;
	SetConsoleCursorPosition(consoleHandle, Cur);
}

COORD는 2차원 좌표를 나타내는데 사용되는 구조이다. 그래서 x y 위치를 표현할 수 있음

 

 

 

 

위 세 함수까지만 구현하고

main 함수에 다음과 같이 설정하고 실행해봤다.

 

GetAsyncKeyState함수는 키입력을 받는 함수이다.

Sleep 함수는 코드 진행 시간을 지연시키는 함수이며,괄호안에 숫자가 ms밀리세컨드 단위로 지연된다.

(즉, Sleep(1000)이면 1초 쉬고실행)

 

 

 

실행해보니, 커서도 안보이게 잘 움직이나 콘솔창 밖을 벗어나면 통제에 벗어나며 계속 왼쪽으로 움직인다.

 

 

 

 

 

 

 

수정하기

 

if (GetAsyncKeyState(VK_UP) & 0x8000) {
	if (y > 0)
		y--;
}
if (GetAsyncKeyState(VK_DOWN) & 0x8000) {
	if (y < Map_Y_MAX - 1)
        y++;
}
if (GetAsyncKeyState(VK_LEFT) & 0x8000) {
    if (x > 0)
		x -= 2;
}
if (GetAsyncKeyState(VK_RIGHT) & 0x8000) {
	if (x < Map_X_MAX - 2)
		x += 2;
}

키 입력 받고 커서가 움직이는 코드쪽을

단순히 해당 맵을 넘어가면 움직이지 않게 코드를 짰다.

넘어가면 왜 커서가 통제 불능에 자동으로 이동하는지는 모르겠지만...

일단 경계를 넘어가지 않게 코드를 해서 조치를 취했다.

 

그 결과 경계를 넘지 않아 오류가 생기지 않는다.

 

오늘은 여기까지~!

 

 

 

 

Reference