게임루프에 대하여
유니티 같은 엔진으로 게임개발을 시작하게 되면,
게임 루프라는 개념이 생소 할 수 있을것 같아요.
게임 뿐만 아니라 어플리케이션 이라면 무한루프가
있을 수 밖에 없는데요.
즉 엔트리포인트를 시작으로 while문을 만나지 않으면
프로그램이 그냥 종료되고 말겠죠.
//C Style
void main()
{
초기화 루틴
무한루프(종료될때까지)
종료루틴
}
------------------------------------------
#Python Style
def main :
초기화
무한루프(종료될때까지)
종료루틴
즉 게임루프란..
무한루프에서 이루어지는 게임프로세스
라고 할 수 있겠어요.
게임루프의 구조는 보통 다음과 같아요.
게임루프() :
# 업데이트
Game_Update()
# 렌더링
Game_Render()
게임엔진을 사용하면 Render를 직접 할일이
잘없기 때문에 Update만 주로 다루게 되는 것입니다.
게임엔진의 Update 구조는 대략 이럴거에요.
void Game_Update()
{
List<GameObject> listDestroy = new List<GameObject>();
if (게임오브젝트를 생성할게 있으면)
{
newObject = new GameObject();
newGameObject.Awake();
listGameObjects.add(newObject);
}
for(gameObject in listGameObjects)
{
if(gameObject.IsStart() == false)
gameObject.Start();
if(gameObject.Update() == false)
{
listDestroy.add(gameObject);
}
}
for(destObject in listDestroy)
{
destObject.OnDestroy();
listGameObjects.remove(destObject);
delete destObject;
}
listDestroy.clear();
}
(대충 게임오브젝트가 생성될때 Awake,
최초 업데이트시 Start, 갱신때 Update,
삭제될때 OnDestroy 가 호출되고 있는 C Style 수도코드입니다.)
대략 위와 같이 구성되어 있으니 게임루프안에서
GameObject의 생성, 갱신, 종료가 이루어 집니다.
Render는 게임오브젝트를 직접 그리는 부분이며,
보통의 게임엔진에서는 직접 다룰일이 잘 없고
쉐이더나 그리는 순서 정도만 컨트롤 합니다.
테스트 베드 (TestBed)
게임루프에 대해 알아봤으니 본격적으로
파이썬에서 게임루프를 만들어봐요~
파이썬 환경 구축 및 기초는 아래 링크를 보고 와주시구요.
https://goldryul.tistory.com/28
여기서는 게임루프 구조만 잡아 보겠습니다.
main.py
라는 파일을 만들고 아래 소스를 복붙 해주세요.
import pygame
import GameLogic
pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption('GameTest')
clock = pygame.time.Clock()
logic = GameLogic.GameLogic_01(screen)
def Main ():
running = True
while running:
for event in pygame.event.get():
if(event.type == pygame.QUIT):
running = False
break
if(running) :
logic.Process()
pygame.display.flip()
clock.tick(60)
Main()
pygame.quit()
GameLogic이라는 패키지를 만들것입니다.
GameLogic이라는 폴더를 만들고, 이 안에
__init__.py
라는 파일을 만들어 주세요.
그리고 아래와 같이 입력합니다.
from .GameLogic_01 import GameLogic_01
그리고 마찬가지로 GameLogic 폴더안에
GameLogic_01.py
라는 파일을 만들어 주세요.
import pygame
#같은 패키지내 클래스들 모두 참조하기 위해
from . import *
class GameLogic_01 :
def __init__(self, screen):
self.screen = screen
def Process(self):
pass
def __del__(self):
pass
엔트리포인트를 main으로 잡고 실행 하면
GameLogic의 Process가 호출되겠지요.
main.py에서 이부분
logic = GameLogic.GameLogic_01(screen)
여기에 완전히 다른 구조의 로직이라면
GameLogic_02를 만들고
logic = GameLogic.GameLogic_02(screen)
이런 식으로 교체해볼 수 있게 됬어요.
이렇게 게임루프의 구조를 잡아두면,
게임로직을 테스트할 수 있는 테스트베드를
구축한 샘이 됩니다.
아래 샘플 프로젝트를 공유해 드리니 압축풀고
폴더열기 해서 실행해보세요.
실행하면 위와 같은 창이 뜰거에요.
GameLogic_01에
간단히 박스 스프라이트가 왔다갔다 하는 예제를 첨부했어요.
GameLogic_02 ~ 99
이런 식으로 추가해서 매번 다른 프로세스를 소개할까 합니다.
그럼 앞으로의 강좌들을 기대해주세요.
안녕~