개발/C, C++

C언어로 게임만들기 - 1. 게임 기본구조

huiyu 2017. 3. 14. 22:16

요즘은 게임엔진과 게임프레임워크의 지원이 잘되어있어서 게임 만들기가 훨씬 쉬워졌습니다.
그래서 항상 궁금했었던 부분이 C언어로 내가 처음부터,  콘솔화면에는 게임을 어떻게 만드는지에 대해서는 의문이 많았는데요.
'C를 이용한 게임만들기'라는 책을 쓰신 저자님께서 정리를 굉장히 잘 해주셨더라구요.(책은 이미 절판되어서 구할 수 없습니다.)


'C를 이용한 게임만들기' 저자 이태성님께서 올리신 가이드를 참고하며 차근차근 처음부터 공부해보려합니다.

보다 자세한 내용은 아래 사이트에 잘 정리되어 있습니다! 저는 아래 링크를 참고하고 있습니다.
C 게임프로그래밍  강좌 : http://nowcampus.tistory.com/

첫번째 내용은 튜토리얼의 3장-게임의 기본 구조입니다.


게임의 기본 구조

게임의 기본 구조는 초기화->((반복)데이터갱신->화면출력)->해제의 순서로 진행되게 된다.

 - 초기화 : 게임에 필요한 데이터 초기화
 - 데이터 갱신 : 입력장치에 의한 데이터 갱신/스스로 데이터 갱신
 - 화면출력 : 실제 게임이미지 화면에 그려준다.
 - 해제  : 메모리 해제

이를 코드로 만들면 아래와 같은 형태가 됩니다.

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
#include<stdio.h>
 
void Init()
{
}
 
void Update()
{
}
 
void Render()
{
}
 
void Release()
{
}
 
int main()
{
    Init();//초기화
 
    while (1)
    {
        Update();//데이터 갱신
        Render();//화면 출력
    }
    Release();//해제
    return 0;
}
cs

* Render() : 실제 게임의 화면을 그려주는 함수
  - 보통 게임 화면을 그리는 과정은 이미지를 화면에 그리고 지우는 과정의 반복.
  - 이 과정을 DirectX, OpenGL과 같은 엔진이 빠르게 해주지만, 콘솔로 직접 구현할 경우 깜빡임 발생.
  - 깜빡임이 발생하는 이유는 콘솔에서는 고속으로 화면을 지우고 그리게 할 수가 없어서 발생.

-> 이러한 문제를 해결하기 위해, 한 장면을 그리고 약간의 대기시간을 두어 렌더의 속도를 늦춘다면 깜빡임이 없어진다.

-> 사람의 눈은 1초에 30번 이상의 화면 전환을 부드럽게 인식한다고 한다.
while문 내부에 Update()->Render()가 1초에 30번의 호출이 일어나게 한다면, 깜빡임은 최소화하면서 사람의 눈에도 자연스럽게 그릴 수 있다.

*즉, Update()->Render() 후 약 33ms대기시간을 주게되면 1초에 30번 그리게 된다.

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
#include<stdio.h>
#include<time.h>
 
void Init()
{
}
 
void Update()
{
}
 
void Render()
{
}
 
void Release()
{
}
 
int main()
{
    clock_t CurTime, OldTime;
    Init();//초기화
 
    while (1)
    {
     OldTime = clock();
        Update();//데이터 갱신
        Render();//화면 출력
        while (1)//대기 상태 진입
        {
            CurTime = clock();
            if (CurTime - OldTime > 33)
                break;
        }
    }
    Release();//해제
    return 0;
}
cs

#include<time.h>: C언어 표준 라이브러리, 시간/날짜를 얻거나 조작
clock_t : 틱(시간을 측정하는 기준주기)를 저장하는 형식
clock(); : 프로그램이 시작될때 부터 지난 틱 수 반환

* OldTime에 clock()함수로 render전 시간을 입력, 대기상태에 들어간 후 CurTime을 계속 갱신해 준다.
  CurTime과 OldTime의 차가 33(ms)일 때 대기상태를 빠져나간다.


키보드 처리

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
#include<stdio.h>
#include<time.h>
#include<conio.h>
 
void Init()
{
}
 
void Update()
{
}
 
void Render()
{
}
 
void Release()
{
}
 
int main()
{
    int nKey;
    clock_t CurTime, OldTime;
 
    Init();//초기화
 
    while (1)
    {
        if (_kbhit())
        {
            nKey = _getch();
            if (nKey == 'q')
                break;
            switch (nKey)
            {
            case 'j':
                break;
            case 'l':
                break;
            }
        }
        OldTime = clock();
        Update();//데이터 갱신
        Render();//화면 출력
        while (1)
        {
            CurTime = clock();
            if (CurTime - OldTime > 33)
                break;
        }
    }
    Release();//해제
    return 0;
}
cs

#include<conio.h> : 콘솔 입출력을 제공하는 헤더파일
if (_kbhit()) : 키가 눌렸음을 확인하는 함수
nKey = _getch(): 읽은 문자를 반환

* q가 들어왔을 때 종료


728x90
반응형

'개발 > C, C++' 카테고리의 다른 글

C언어로 게임만들기 - 3. 렌더링 기능 구현  (2) 2017.03.15
C언어로 게임만들기 - 2. 게임 프로그래밍 용어  (0) 2017.03.14
현재 디렉토리 경로 알아오기  (0) 2014.10.20
3_Decay  (0) 2014.07.23
2_new_정리  (0) 2014.07.23