학교 동아리 프로젝트에서 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
'코딩 > C, C++' 카테고리의 다른 글
C언어로 게임 만들기(7) - 완성. (코드, 구현 영상) (0) | 2023.06.02 |
---|---|
C언어로 게임 만들기(5) - 게임 씬 추가(getch함수, exit함수) (0) | 2023.05.28 |
C언어로 게임 만들기(4) - 적 구현(rand함수, srand함수, time함수) (1) | 2023.05.20 |
C언어로 게임 만들기(3) - 총알 발사 및 UI 표시 (0) | 2023.05.19 |
C언어 게임 만들기(2) - 캐릭터 출력 및 이동 (1) | 2023.05.14 |