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

C언어로 게임 만들기(3) - 총알 발사 및 UI 표시

by JuBro 2023. 5. 19.

지난 시간에는 캐릭터 이동까지 구현했다.

 

C언어 게임 만들기(2) - 캐릭터 출력 및 이동

https://jubrodev.tistory.com/1 C언어로 게임 만들기(1) - (콘솔창 세팅, window.h, conio.h) 학교 동아리 프로젝트에서 C언어로 게임만들기를 하고 있어서 한번 게임을 만들어보려고 한다. 내가 만들고 싶은 게

jubrodev.tistory.com

 

 

 

투사체 코드

오늘은 이 캐릭터가 총알을 쏘는 것을 구현할 것이다.

1
2
3
4
5
6
7
8
//탄막 정보 구조체
typedef struct bullet {
    int x, y;
    bool Active;
}Bullet;
 
Bullet Bullet_info[MAXBULLET];
 
cs

일단 총알 하나당 x,y의 위치와 이 총알이 현재 화면에 있는지 확인하기 위해 bool 변수를 선언한다.

이후 총알이 여러개니까 배열로 선언해준다.

 

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
void Bullet_Shoot(Bullet* pBullet, plane* pPlane) {
 
    //총알 이동
    for (int i = 0; i < MAXBULLET; i++) {
        if (pBullet[i].Active) {
            pBullet[i].y--;
            mapData[pBullet[i].y * Map_X_MAX + pBullet[i].x] = '*';
 
            if (pBullet[i].y < 1) {
                pBullet[i].Active = false;
            }
        }
    }
    const int a = pPlane->x;
    const int b = pPlane->y;
 
    //총알 발사
    if (GetAsyncKeyState(VK_SPACE)) { //SPACE
        if (b_index > 10)return;
        pBullet[b_index].x = a;
        pBullet[b_index].y = b;
        pBullet[b_index].Active = true;
        b_index++;
    }
}
cs

여기서 핵심은 

pBullet.x = pPlane.x를 바로 해버리면, 캐릭터의 움직임에 총알도 영향을 받기 때문에

a,b 와 같은 새 변수를 선언해준뒤 넣어준다.

 

 

이제 스패이스를 누르면 총알이 나가는 것을 구현 완료 했다.

 

 

그런데 총알을 10개로 제한했는데 알길이 없어서 표현해야겠다.

 

 

UI 코드

UI는 전에 작성했던 DrawSprite 함수를 전적으로 이용한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//맵 데이터를 수정하는 함수
void EditMap(int x, int y, char str) {
    if (x > 0 && y > 0 && x - 1 < Map_X_MAX - 1 && y - 1 < Map_Y_MAX - 1)
        mapData[(y - 1) * Map_X_MAX + x - 1] = str;
}
 
//텍스트를 이미지화 하여 출력하는 함수
void DrawSprite(int x, int y, int size_x, int size_y, char spr[]) {
    for (int i = 0; i < size_y; i++) {
        for (int j = 0; j < size_x; j++) {
            EditMap(x + j, y + i, spr[i * size_x + j]);
        }
    }
}
cs

Unity 해보신분은 이미지 sprite를 아실텐데, 이미지를 만드는 함수라고 생각하면된다.

시작점과, 이미지의 크기, 이미지를 만들 텍스트 문자열이 있으면 된다.

 

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void ShowOption() {
    DrawSprite(1, 39, 7, 1, "총알 : ");
    for (int i = 0; i <= 10; i++) {
        if (b_index - 1 >= i) {
            EditMap(10+i, 39, '/');
        }
        else {
            EditMap(10 + i, 39, '0');
        }
    }
 
    DrawSprite(60, 37, 18, 1, "조작 : 상,하,좌,우");
    DrawSprite(60, 38, 12, 1, "공격 : Space");
    DrawSprite(60, 39, 13, 1, "재장전 : Ctrl");
}
cs

이후 코드를 이렇게 짜 준다.

인덱스가 있을때를 참고하여 총알이 있는것을 표현한다.

여기서 주의할점은 한글 및 특수문자들은 콘솔의 두칸을 차지한다. 그래서 그것을 따지면서 이미지 크기를 설정해야한다.

ex) "총알 : " 문자열의 길이 = 7(한글 한글자당 2칸)

 

 

 

아래에 이쁘게 잘 표현이 되었다! ㅎㅎ

 

오늘은 여기까지~

 

 

 

 

 

 

 

 

 

 

 

Reference