강의/C언어 게임 만들기

C언어로 게임 만들기 2. 시분할 (1) 시분할이란?

moon44432 2020. 11. 12. 14:54

C언어로 게임 만들기
2. 시분할
(1) 시분할이란?

반갑습니다. 이번 강의에서는 슈팅 게임을 개발할 때 필수적으로 구현해야 할 시분할 기법에 대해 다룰 것입니다.


시분할은 무엇이며, 왜 쓸까?

우선 시분할이 무엇인지 알아야겠죠? 쉬운 예를 들어 봅시다.
0.3초마다 ‘A’를 출력하고, 0.4초마다 ‘B’를 출력하는 작업을 동시에 수행하는 프로그램을 작성해야 합니다.
이 때 여러분은 어떻게 코드를 작성할 것인가요?

while (true)
{
    printf("A");
    Sleep(300); // usleep(300000);
    printf("B");
    Sleep(400);
}

 

이런 코드를 작성했다고 가정합시다. 분명히 'A'를 출력하는 부분과 'B'를 출력하는 부분을 모두 작성하긴 했습니다. 문제는 두 개의 작업이 동시에 이루어지지 않는다는 점입니다. 'A'를 출력하고 0.3초간 대기한 후 'B'를 출력하고, 또 0.4초를 기다려야 다시 'A'를 출력하므로 의도한 것과는 완전히 다른 동작이죠.

우리가 원하는 기능을 구현하려면 다음과 같이 하면 됩니다. 0.1초에 한번씩 카운터 값을 증가시키고, 그 값이 3의 배수일 때 ‘A’를 출력하고 4의 배수일 때 ‘B’를 출력합니다. 이렇게 하면 0.3초에 한번씩 ‘A’를 출력하고 0.4초에 한번씩 ‘B’를 출력하는 작업이 동시에 처리되는 것처럼 보이는 셈입니다.

제대로 작동하는 코드는 아래와 같습니다.

int cnt = 0;

while (cnt < MAX)
{
    if (cnt % 3 == 0) printf("A");
    if (cnt % 4 == 0) printf("B");

    Sleep(100);
    cnt++;
}



이렇듯, 시분할은 시간을 잘게 조각내어 필요한 작업에 나누어 주는 방식이라고 할 수 있습니다. 운영체제의 멀티태스킹 등 여러 처리 과정이나 작업들이 동시에 작동되어야 하는 상황에서 시분할을 사용합니다.

시분할은 어떤 게임에 적용해야 할까?

그렇다면 시분할 기법은 어떤 게임에 적용하는 것이 좋을까요?

1. 카드놀이

포커 (이미지 출처 : 위키백과)
솔리테어

포커는 전형적인 턴 게임입니다. 게임은 정해진 룰대로 진행되며, 동시에 일어나는 사건이 잘 없습니다. 한 사건이 끝나기 전까지 프로그램은 대기하며, 그 사건이 끝나야 다음 사건이 진행됩니다. 컴퓨터용 포커 게임을 개발한다고 했을 때, 게임의 핵심은 다음과 같이 구현될 것입니다.

솔리테어는 혼자 플레이하는 게임이지만, 역시 핵심은 마찬가지입니다. 플레이어가 카드를 움직이는 사건밖에 존재하지 않으며, 카드를 움직이기 전까지 프로그램은 아무 것도 하지 않고 대기해야 합니다.

2. 오픈월드 게임

Grand Theft Auto V

반면 GTA와 같은 오픈월드 게임은 카드놀이와는 차원이 다른 것입니다. 수많은 사건이 동시에 일어나는 상황이지요. 플레이어, NPC, 자동차, 동물, 잔디의 세세한 움직임까지도 한번에 일어나고 있습니다. 이런 게임에서, 플레이어가 '전진' 키를 누르기까지 무한정 기다린다거나, 자동차가 전진하는 동안에 다른 것들이 모두 대기 상태로 멈춰 있는 일은 일어날 수 없겠지요. 그러므로 카드놀이와 같은 개발 방식은 절대 적용할 수 없습니다. 여기서 필요한 것이 시분할 기법입니다.

3. 슈팅 게임

울펜슈타인 3D (이미지 출처 : https://www.mobygames.com/game/pc98/wolfenstein-3d/screenshots/gameShotId,467403/)

우리 강의에서 만들어 나갈 게임은 슈팅 게임입니다. 오픈월드 게임과 마찬가지로, 슈팅 게임에서도 여러 가지 사건이 동시에 일어납니다. 예를 들어 여러분이 아무 키도 누르지 않고 가만히 있는 동안에도, 적은 움직이며 공격하려 들 것입니다. 따라서 시분할을 적용해야겠지요. 다음 강의부터는 본격적으로 시분할 구현에 대해 설명할 예정입니다.


이상으로 강의를 마칩니다. 감사합니다.
오타나 잘못된 부분은 댓글로 지적해 주시기 바랍니다.