https://jubrodev.tistory.com/4
저번시간엔 적 구현까지 끝냈습니다.
사실 게임의 메인화면은 구성이 다 끝난것이죠,
근데 처음 시작메뉴화면이랑, 게임오버 화면을 만들며 더 부족한 부분을 수정하려고 합니다!!
게임시작 화면
화면전환은 쉽습니다.
Unity의 Scene order처럼, 각 화면에 해당하는 변수를 만들어서 어떤 버튼을 누르면 그 변수를 바꿔 화면을 바꾸면 됩니다.
저는 gamestatus 변수를 전역변수로 설정했고, 0은 프로그램 시작시 시작메뉴씬, 1은 게임진행 씬, 2는 게임오버씬으로 만들었습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
int gameStatus=0;
//게임시작메뉴
void gamestart() {
FillMap(mapData, ' ', Max_value);
textcolor(11);
DrawSprite(25, 4, 30, 7, "■■■■■■■■■■■■■■■■■□□□□■■■□□□□■■■■□■■■■■□■■■■■■■■□□□■■■□■□□□■■■■□■■■■■□■■□□■■■■□■■■■■■□□■□■■■■■■■■■■■■■■■■■");
//점수
DrawSprite(36, 16, 11, 1, "1. 게임시작");
DrawSprite(36, 21, 7, 1, "2. 랭킹");
DrawSprite(36, 26, 7, 1, "3. 종료");
if (getch() == '1') {
gameStatus = 1;
}
else if (getch() == '2') {
gameStatus = 1;
}
else if (getch() == '3') {
textcolor(11);
exit(0);
}
}
|
cs |
다음과 같은 시작 화면 완료!
그리고 랭킹 시스템은 아직 구현을 못해서 1번과 같은 기능으로 넣었습니다.
여기서 쓰이는 getch함수와 exit 함수에 대해 잠깐 알아보고 갑시다.
getch() | exit() | |
설명 | 키보드에서 입력한 단일 문자를 읽는 데 일반적으로 사용됩니다. "즉시 문자 가져 오기"를 의미하고 따로 엔터 등을 안쳐도 됩니다. | 콘솔을 강제종료하는 기능을 쓰고싶을때 쓰는 함수 |
필요해더파일 #include | conio.h | stdlib.h |
예시 | getch() == 1 // 키보드에서 1입력을 판단 | exti(0) = 종료 / exit(1) = 비정상적 종료 |
getch()함수와 비슷한게 kbhit함수가 있는데
게임오버 화면
한가지 아쉬운 점은 제가 처음 코드를 맵 전체를 계속 출력하는 함수로 짜버려서
글자 하나하나 색깔로는 못바꾸는게 참 아쉽네요
다음에 바꿀땐 다르게 맵프레임 출력을 해봐야겠어요
하여튼 게임오버가 됐을때도 게임시작화면과 똑같이 구성해줘서 짜주면 됩니다!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
void gameover() {
FillMap(mapData, ' ', Max_value);
textcolor(12);
DrawSprite(35, 5, 12, 1, "GAME OVER !!");
//점수
DrawSprite(36, 16, 9, 1, "1. 재도전");
DrawSprite(36, 21, 7, 1, "2. 랭킹");
DrawSprite(36, 26, 7, 1, "3. 종료");
if (getch()=='1') {
gameStatus = 1;
}
else if (getch() == '2') {
gameStatus = 1; // 아직 구현
}
else if (getch() == '3') {
textcolor(11);
system("cls");
}
}
|
cs |
그런데 문제가.. 재도전을 하면 게임 status 변수만 바꾸는거여서 그 전 진행상황이 그대로 가져오게 됩니다.
그렇다면! 진행상황을 초기화하는 reset함수도 한번 구현을 해봅시다.
Reset함수 (재시작시 게임환경 초기화)
1
2
3
4
5
6
7
8
9
10
11
12
13
|
void gamereset(Bullet* Enemy_Bullet, Enemy* Enemy, Bullet* pBullet, plane* pPlane) {
i_index = 0;
eb_index = 0;
pPlane->x = Map_X_MAX / 2 + 1;
pPlane->y = Map_Y_MAX / 3 * 2 + 1;
for (int i = 0; i < 10; i++) {
Enemy[i].Active = FALSE;
pBullet[i].Active = FALSE;
for (int j = 0; j < 1000; j++) {
Enemy_Bullet[j * 10 + i].Active = FALSE;
}
}
}
|
cs |
reset은 그냥 쉽게 처음 세팅 그대로, 배열같은건 0으로 놓고 Active는 false로 다 둬버리면 됩니다!
이후 게임 오버화면에서 재시작 버튼을 누르면 gamestatus를 바꾸기 전에 이함수를 먼저 실행하면 됩니다.
+적이 10마리 나오는데 다 죽이면 게임 클리어 화면도 넣었습니다
오늘은 여기까지~!
'코딩 > C, C++' 카테고리의 다른 글
[C++] 포인터 call by reference, new 연산자 (0) | 2024.03.20 |
---|---|
C언어로 게임 만들기(7) - 완성. (코드, 구현 영상) (0) | 2023.06.02 |
C언어로 게임 만들기(4) - 적 구현(rand함수, srand함수, time함수) (1) | 2023.05.20 |
C언어로 게임 만들기(3) - 총알 발사 및 UI 표시 (0) | 2023.05.19 |
C언어 게임 만들기(2) - 캐릭터 출력 및 이동 (1) | 2023.05.14 |