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

C언어로 게임 만들기(5) - 게임 씬 추가(getch함수, exit함수)

by JuBro 2023. 5. 28.

https://jubrodev.tistory.com/4

 

C언어로 게임 만들기(4) - 적 구현(rand함수, srand함수, time함수)

https://jubrodev.tistory.com/3 C언어로 게임 만들기(3) - 총알 발사 및 정보표시 지난 시간에는 캐릭터 이동까지 구현했다. C언어 게임 만들기(2) - 캐릭터 출력 및 이동 https://jubrodev.tistory.com/1 C언어로 게

jubrodev.tistory.com

 

저번시간엔 구현까지 끝냈습니다.

 

사실 게임의 메인화면은 구성이 다 끝난것이죠,

 

근데 처음 시작메뉴화면이랑, 게임오버 화면을 만들며 더 부족한 부분을 수정하려고 합니다!!

 

 

 

게임시작 화면

화면전환은 쉽습니다.

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(254307"■■■■■■■■■■■■■■■■■□□□□■■■□□□□■■■■□■■■■■□■■■■■■■■□□□■■■□■□□□■■■■□■■■■■□■■□□■■■■□■■■■■■□□■□■■■■■■■■■■■■■■■■■");
    //점수
    DrawSprite(3616111"1. 게임시작");
    DrawSprite(362171"2. 랭킹");
    DrawSprite(362671"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(355121"GAME OVER !!");
    //점수
    DrawSprite(361691"1. 재도전");
    DrawSprite(362171"2. 랭킹");
    DrawSprite(362671"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->= Map_X_MAX / 2 + 1;
    pPlane->= 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마리 나오는데 다 죽이면 게임 클리어 화면도 넣었습니다

오늘은 여기까지~!