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

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

by JuBro 2023. 5. 14.

 

https://jubrodev.tistory.com/1

 

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

학교 동아리 프로젝트에서 C언어로 게임만들기를 하고 있어서 한번 게임을 만들어보려고 한다. 내가 만들고 싶은 게임은 2D 종스크롤 슈팅게임을 만들어보고싶다. 일단 필요한 기능들을 도식화

jubrodev.tistory.com

저번 시간엔 콘솔창을 세팅하였다.

 

 

오늘은, 이제 주인공 캐릭터(기체)를 만들고, 거기서 탄막이 나오는것까지 코딩을 해볼 것이다.

 

 

맵 설정

자고로 게임을 처음 시작할때 기본 맵을 설정한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void FillMap(char str[], char str_s, int max_value) {
    for (int i = 0; i < max_value; i++) {
        str[i] = str_s;
    }
}
 
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)
        str = mapData[(y - 1* Map_X_MAX + x - 1];
}
 
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

처음 맵 설정은 세 함수로 이루어져 있다.

  • 처음 FillMap 함수는 전체 맵을 초기화할 목적이다. ' ' 스페이스바로 초기화 시켜놓고 안에 UI나 캐릭터나 다른 텍스트로 대체하는 형식으로 할것이다.
  • 다음 EditMap 함수는 어떠한  텍스트(str)로 대처할때, 쓰이는 함수이다.
  • DrawSprite 함수는  텍스트 문자열이 주어지고, 그 문자열의 가로 세로 크기가 주어진다면 그 크기대로 출력하는것이다. 텍스트의 이미지화 한 느낌이다.

콘솔창에서 좌표는 시작할때 커서가 위치하는 처음 왼쪽 상단이 (0,0)이고 오른쪽으로 갈수록 x값 증가, 아래쪽으로 갈수록 y값이 증가하는 개념이다.

 

 

 

 

 

 

캐릭터 출력하기

이제 캐릭터를 설정해주고 세팅해주자.

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
//캐릭터 위치, 크기를 설정하는 구조체
typedef struct Character {
    int x, y, size_x, size_y;
    char sprite[6];
}plane;
 
//캐릭터 조종 함수
void controlcharacter(plane *pPlane) {
    if (GetAsyncKeyState(VK_UP) & 0x8000) {
        if (pPlane->> 0)
            pPlane->y--;
    }
    if (GetAsyncKeyState(VK_DOWN) & 0x8000) {
        if (pPlane->< Map_Y_MAX - 1)
            pPlane->y++;
    }
    if (GetAsyncKeyState(VK_LEFT) & 0x8000) {
        if (pPlane->> 0)
            pPlane->-= 2;
    }
    if (GetAsyncKeyState(VK_RIGHT) & 0x8000) {
        if (pPlane->< Map_X_MAX - 2)
            pPlane->+= 2;
    }
}
cs

일다

 

ㅇㅇ

위치, 크기의 정보가 들어있는 구조체로 선언해주고

 

키를 받아 조종하는 함수도 따로 빼놓는다

(+ 캐릭터의 크기에 따라 벽과 닿는 좌표가 다르니 그 부분은 개인적으로 조정이 필요!)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int main(void)
{
    plane myPlane;
    myPlane.x = Map_X_MAX / 2 + 1;
    myPlane.y = Map_Y_MAX / 3 * 2 + 1;
    myPlane.size_x = 3;
    myPlane.size_y = 2;
    strncpy(myPlane.sprite, "_^_^^^"sizeof(myPlane.sprite));
    SetConsole();
 
    while (1) { //게임 진행 코드
        FillMap(mapData, ' ', Max_value);
        controlcharacter(&myPlane);
        textcolor(3);
        DrawSprite(myPlane.x, myPlane.y, myPlane.size_x, myPlane.size_y, myPlane.sprite);
        printf("%s", mapData);
        Sleep(50);
    }
    return 0;
}
cs

이후 메인함수에는 다음과 같이 선언해준다.

구조체도 따로 불러오고, 구조체의 변수들을 초기화해준다.

여기서, strcnpy 함수는 문자열을 복사하는 함수로, strcnpy(복사받는 문자열, 복사하는 문자열, 문자열 크기) 이렇게 입력한다.

 

움직임을 구현완료!

 

 

 

기체에서 나가는 탄막 생성

탄막생성엔 계속 오류가 생겨서 여기서 끊고 탄막 코드는 다음에 올려야겠다!

다음시간엔 비행기 기체에서 탄막이 계속 나가는 것을 구현해야 할것이다.

 

 

 

 

 

 

 

 

 

Reference