본문바로가기
[게임 디자인 씽킹] [게임 디자인 씽킹] 게임 개발을 더 쉽게! 게임 루프
수학동아 2020.09.25 18:10

게임에서는 수많은 오브젝트가 상호작용합니다. 각각의 오브젝트는 상태 값과 위치, 모양 등을 수시로 바꾸죠. 게임은 이 모든 상호작용을 하나의 반복 루프 에서 처리하는데 이것을 ‘게임 루프(Game Loop)’라고 합니다. 게임 루프는 게임 오브젝트의 상태와 화면에 보이는 형태를 도식화해 관리함으로써 복잡한 게임 로직을 쉽게 프로그래밍할 수 있게 만듭니다.

 

 

 

 

다음 코드를 볼게요. Lua와 LOVE2D 프로그래밍 언어로 작성된 위의 코드에서는 게임 루프 초기화를 load() 모듈에서, 상태 변경을 update() 모듈에서, 화면에 그리기를 draw() 모듈에서 처리합니다. 이 코드는 80x80 크기를 가진 사각형을 (0, 100)에 위치하도록 한 다음 x값을 1씩 증가하면서 사각형을 화면에 그립니다. 코드를 실행하면 (0, 100)에 처음 놓인 사각형이 오른쪽으로 이동하죠.

 

 

<예시 코드>

function love.load()

x = 0

end

function love.update()

x = x + 1

end

function love.draw()

love.graphics.rectangle("line", x, 100, 80, 80)

end

 

 

다음은 게임 루프를 스크래치로 코딩한 것입니다. 코드에서 사각형 오브젝트(Square)는 스크래치에서 직접 그려서 사용합니다.

 

 

 

<게임 루프 오브젝트 코드>

1. 게임을 실행하면 보이지 않도록 한다. 이 오브젝트는 게임 루프를 관리하는 역할을 한다.

2. update, draw라는 이름의 방송 메시지를 만든다.

3. update, draw 방송 메시지를 순서대로 무한히 방송한다.

 

 

 

<사각형 오브젝트 코드>

1.  시작하면 오브젝트의 x 좌표를 저장하는 변수(xpos)에 –100을 입력한다.

2. update 방송 메시지를 받으면 xpos 값을 1 증가시킨다.

3. draw 방송 메시지를 받으면 스프라이트의 x좌표를 변경한다.

 

 

 

그런데 위 게임 루프는 문제점이 하나 있습니다. 게임은 실행하는 하드웨어 성능과 무관하게 진행이 일정해야 하는데 앞의 코드에서 사각형의 이동 속도는 실행되는 컴퓨터마다 다를 수 있습니다. 컴퓨터는 하드웨어의 성능에 따라 1초에 30~120번 정도로 모니터에 화면 영상을 다시 나타내는데, 이 화면 재생 빈도가 달라지면서 서로 다른 이동 속도를 만들거든요. 

 

그래서 실제 게임에서는 오브젝트 이동 속도를 컴퓨터가 달라도 일정하게 유지 하도록 ‘델.타 타임(Delta Time)’이라는 시간 개념을 게임 루프에 추가합니다. 델타 타임은 이전에 화면을 나타냈을 때부터 현재까지의 흘러간 시간으로 정의하기 때 문에 하드웨어의 성능에 상관 없이 1초 동안 모두 더하면 1이 됩니다.

 

 

델타 타임 = 현재 화면을 그릴 때 시간 – 바로 이전에 화면을 그렸을 때 시간

 

 

 

 

델타 타임 개념을 게임 루프에 적용하면 컴퓨터마다 다를 수 있는 게임 오브젝 트의 이동 속도를 같게 만들 수 있습니다. 오른쪽 상자는 델타 타임 개념을 적용한 게임 루프를 도식화한 것입니다. 아래 코드는 델타 타임 개념을 적용한 게임 루프를 통해 1초에 200픽셀만큼 사각형을 이동시키는 스크래치 예시 코드입니다. 

 

 

 

<게임 루프 오브젝트 코드>

무한반복 블록 내에서 현재와 이전에 실행된 시간 차이를 deltatime에 저장한다.

 

 

<사각형 오브젝트 코드>

1. speed에 1초당 이동 거리(픽셀) 값을 저장한다.

2. update 방송 메시지를 받으면 xpos 변숫값에 speed * deltatime값만큼 증가시킨다.

 

 

 

델타 타임이 적용된 게임 루프 구조를 기본으로 해 여러분의 게임을 스크래치로 프로그래밍해보세요. 우수한 결과물을 올린 분들께 게임 관련 선물을 드립니다! 지금 바로 참여하세요!

 

 

 

첫 댓글의 주인공이 되어 보세요!
  • 폴리매스 문제는 2019년도 정부의 재원으로 한국과학창의재단의 지원을 받아 수행된 성과물입니다.

  • ☎문의 02-6749-3911