본문 바로가기
개발 일지

C언어 콘솔로 간단한 RPG 게임 만들기 - 01. 콘솔 셋팅과 움직임 구현

by PrintedLove 2020. 1. 23.

 

 

 안녕하세요! PrintedLove 입니다.

 일단 오래전부터 GameMakerStudio로 만들던 rpg게임 만들기 프로젝트가 잠정 중단되었음을 선언합니다 ㄷㄷ

 이유는 도저히 못건드릴 정도로 최적화가 망해서...  하하

 대학교에서 수업과 선배님들을 통해 여러 노하우와 기법들을 배운 결과 눈이 높아져 버렸습니다. 이제보니 영 이상하게 코드를 짠게 보여서 도저히 못건들이겠더라구요. 새로 엎어서 만드는게 빠를것 같았습니다.

 때문에 GameMaker 제작은 잠시 미뤄두고 제가 좋아하는 C언어로 게임을 한번 만들어보기로 했습니다.

 저번에 만든 파이썬 슈팅게임처럼 이미지 파일 없이 순수 텍스트 만으로(!) 알피지 게임 만들기! 가 이번 프로젝트의 목표입니다.

 먼저 영상을 보시죠.

 

 

Dev C++툴을 이용하여 제작하고 있습니다.

blockdmask님의 구글 공룡게임 만들기와 JunkMam님의 GetAsyncKeyState() 강좌를 참고해 콘솔 셋팅과 간단한 움직임을 구현했습니다.

다음은 소스코드 입니다.

 

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
// made by "PrintedLove"
// https://printed.tistory.com/
#include <stdio.h>
#include <time.h>
#include <windows.h>
#define MAP_X_MAX 49
#define MAP_Y_MAX 17
 
char mapData[MAP_X_MAX * MAP_Y_MAX];
 
void SetConsole() {
    
    system("title RPG test");
    system("mode con:cols=49 lines=17");
    
    HANDLE hConsole;
    CONSOLE_CURSOR_INFO ConsoleCursor;
    hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    
    ConsoleCursor.bVisible = 0;
    ConsoleCursor.dwSize = 1;
    
    SetConsoleCursorInfo(hConsole , &ConsoleCursor);
    
    COORD Pos = { 00 };
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);
}
 
void SetValue() {
    
    for (int i = 0; i < MAP_X_MAX * MAP_Y_MAX; i++)
        mapData[i] = ' ';
}
 
int main(int argc, char** argv) {
    
    SetConsole();
    SetValue();
 
    int characterX = MAP_X_MAX / 2 + 1, characterY = MAP_Y_MAX / 2 + 1;
    
    while(1) {
        mapData[(characterY - 1* MAP_X_MAX + characterX - 1= ' ';
        
        if(GetAsyncKeyState(0x41!= 0 && characterX > 1)
            characterX -= 1;
            
        if(GetAsyncKeyState(0x44!= 0 && characterX < MAP_X_MAX)
            characterX += 1;
            
        if(GetAsyncKeyState(0x57!= 0 && characterY > 1)
            characterY -= 1;
            
        if(GetAsyncKeyState(0x53!= 0 && characterY < MAP_Y_MAX)
            characterY += 1;
            
        mapData[(characterY - 1* MAP_X_MAX + characterX - 1= '@';
            
        printf("%s", mapData);
        Sleep(30);
    }
}
cs

 

 window.h 라이브러리를 이용하여 키보드 감지와 콘솔 셋팅을 처리했습니다.

 conio.h 라이브러리의 kbhit() 와 getch() 도 키보드 처리에 사용할 수 있겠지만 RPG특성상 여러 키를 사용하는 경우가 많아 GetAsyncKeyState() 함수를 사용했습니다.

 또, 흔히 콘솔창 초기화로 많이 쓰이는 system("cls") 대신 커서를 0, 0으로 이동, 창 전체를 거대한 문자열로 처리해 렉과 화면 깜박임을 방지했습니다. 대신, 창 크기를 조절하면 맛이갑니다... ㅋ

 

다음 글에서는 캐릭터 애니메이션 등을 해볼 예정인데 아마 UI부터 건들 수도 있습니다.

댓글