강의/C언어 게임 만들기

C언어로 게임 만들기 1. 기초 & 플레이어 움직이기 (2) 플레이어 움직이기

moon44432 2020. 11. 11. 12:56

C언어로 게임 만들기
1. 기초 & 플레이어 움직이기
(2) 플레이어 움직이기

반갑습니다. 이번 강의에서는 키를 눌러 플레이어를 움직이는 방법에 대해 설명하겠습니다.


플레이어를 움직이려면?

먼저 플레이어를 움직이는 간단한 로직을 알아봅시다.

1. 키를 입력받는다. - w, s, a, d 등 조작 키를 입력받아야 합니다.

2. 출력되었던 플레이어를 지운다. - 새로운 위치에 플레이어가 출력될 때 잔상이 생기는 것을 막습니다.

3. 플레이어의 위치를 조사한다. - 현재 플레이어의 좌표가 어디인지 조사해야 합니다.

4. 플레이어의 위치를 제한 범위 내에서 옮긴다. - 플레이어의 좌표를 조사한 후, 화면을 벗어나지 않게 좌표를 옮깁니다.

5. 새 위치에 플레이어를 출력한다.

위의 다섯 가지만 구현하면 플레이어를 이동시키는 기능이 완성됩니다.

구현하기

먼저, 전체 코드를 파악해 보시길 바랍니다.

#include <stdio.h>
#include <Windows.h>
#include <conio.h>

typedef enum { NOCURSOR, SOLIDCURSOR, NORMALCURSOR } CURSOR_TYPE;
void setcursortype(CURSOR_TYPE c)
{
     CONSOLE_CURSOR_INFO CurInfo;
     switch (c)
     {
     case NOCURSOR:
         CurInfo.dwSize = 1;
         CurInfo.bVisible = FALSE;
         break;
     case SOLIDCURSOR:
         CurInfo.dwSize = 100;
         CurInfo.bVisible = TRUE;
         break;
     case NORMALCURSOR:
         CurInfo.dwSize = 20;
         CurInfo.bVisible = TRUE;
         break;
     }
     SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &CurInfo);
}

void gotoxy(int x, int y)
{
     COORD CursorPosition = { x, y };
     SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), CursorPosition);
}

int main(void)
{
     setcursortype(NOCURSOR);
     int x = 0, y = 0;
     char ch;
     gotoxy(x, y);
     printf("@");
     while (true)
     {
         ch = getch();
        
         gotoxy(x, y);
         printf(" ");
         switch (ch)
         {
         case 'w':
              if (y > 0) y--;
              break;
         case 's':
              if (y < 24) y++;
              break;
         case 'a':
              if (x > 0) x--;
              break;
         case 'd':
              if (x < 79) x++;
         }
         gotoxy(x, y);
         printf("@");
     }
}

 

이 코드는 getch() 함수를 사용하는데, 윈도우 환경이라면 conio.h를 인클루드하여 사용할 수 있습니다. 그러나 맥/리눅스 환경에서는 사용할 수 없기 때문에 대체재를 제공합니다.

#include <unistd.h>
#include <termios.h>

int getch()
{
    int c;
    struct termios oldattr, newattr;

    tcgetattr(STDIN_FILENO, &oldattr);
    newattr = oldattr;
    newattr.c_lflag &= ~(ICANON | ECHO);
    newattr.c_cc[VMIN] = 1;
    newattr.c_cc[VTIME] = 0;
    tcsetattr(STDIN_FILENO, TCSANOW, &newattr);
    c = getchar();
    tcsetattr(STDIN_FILENO, TCSANOW, &oldattr);
    return c;
}

 

새로 작성한 getch() 함수는 터미널의 Canonical 모드와 Echo 모드를 잠시 비활성화하여 키보드로 문자를 입력할 때 대기하거나 입력한 문자를 출력하지 않음으로써 거의 동일한 효과를 냅니다. 맥/리눅스 유저는 conio.h 인클루드 부분을 지우고 위 코드를 사용하세요.

코드 분석

1.

ch = getch();

// getch() 함수는 키보드를 누르면 대기 없이 입력한 값을 변수에 저장하는 기능을 가지고 있습니다.

2.

gotoxy(x, y); // 이전에 출력된 플레이어의 좌표(x, y)로 이동합니다.

printf(" "); // 출력된 플레이어를 지움으로써 새 위치에 플레이어가 출력되었을 때 잔상이 남지 않게 합니다.

3, 4.

switch (ch)

{

case 'w': // w 키를 입력받았을 때

     if (y > 0) y--; // 플레이어의 현재 y좌표가 0보다 크면, y좌표를 1 감소하여 위로 이동

     break;

case 's': // s 키를 입력받았을 때

     if (y < 24) y++; // 플레이어의 현재 y좌표가 24보다 작으면, y좌표를 1 증가하여 아래로 이동

     break;

case 'a': // a 키를 입력받았을 때

     if (x > 0) x--; // 플레이어의 현재 x좌표가 0보다 크면, x좌표를 1 감소하여 좌로 이동

     break;

case 'd': // d 키를 입력받았을 때

     if (x < 79) x++; // 플레이어의 현재 x좌표가 79보다 작으면, x좌표를 1 증가하여 우로 이동

}

플레이어가 화면을 벗어나지 않고 움직이게 하려면 좌표값의 제한 범위 확인은 필수입니다.

5.

gotoxy(x, y);

printf("@");

변경된 좌표로 이동하고 플레이어(@)를 출력합니다.

실행 결과

w, s, a, d 키를 눌러 보세요. 플레이어가 화면 내에서 움직입니다.

플레이어를 움직이는 코드는 게임을 개발할 때 항상 쓰이는 코드이므로 꼭 숙지해야 합니다. 생각보다 쉬운 코드이므로 여러 방면으로 개조할 수 있을 것입니다.


지금까지 게임의 가장 기초적인 기능인 플레이어 이동을 구현해 보았습니다. 다음 시간에는 게임의 핵심인 시분할 기법에 대해 알아보겠습니다.

이상으로 강의를 마칩니다. 감사합니다.

오타, 잘못된 내용 지적 환영합니다. 댓글로 질문 바랍니다.