파이게임 시작
목차
본 강좌는 파이썬으로 게임을 만드는 프레임워크인 파이게임(Pygame)을 시작합니다. 파이게임 프레임워크를 설치하고 간단한 게임창을 하나 만들어 보겠습니다.
기본 강좌를 다 마치면 간단한 슈팅게임을 하나 만들 수 있을 것 입니다. 오늘날에는 게임의 장르가 다양하기 때문에 하나의 게임을 만들었다고 크게 대단한 일은 아닐지 모릅니다.
그러나 하나의 게임을 만들 수 있다면 게임의 작동원리을 이해하고 컴퓨터 프로그램의 알고리즘에 대하여 많은 것을 배울 수 있습니다.
파이썬 설치
파이게임으로 게임을 만들기 위해서는 먼저 개발환경을 준비해야합니다.
이 포스트에서는 윈도우10 환경의 개발환경을 기준으로 진행합니다.
파이게임은 파이썬의 모듈이므로 먼저 파이썬을 설치해야 합니다. 아직 파이썬이 설치되어 있지 않다면 아래 링크의 문서를 참고하여 설치합니다.
그 다음은 게임 개발환경(IDE)를 설치해야 합니다.
파이썬의 기본 IDLE 로도 파이게임을 개발해도 됩니다만, IDE의 사용이 익숙하다면 젯브레인 사의 파이참(PyCharm)을 사용하는 것을 추천합니다.
아래의 링크에서 Community 판을 무료로 다운로드 받을 수 있습니다.
익숙해지면 파이참이 편리하지만 IDE가 익숙하지 않다면 먼저 파이썬의 기본 IDLE에 익숙해진 다음 파이참을 사용하는 것도 좋습니다.
파이게임 설치
위의 설치가 잘 되었다면 이제 파이게임 모듈을 설치해야할 차례입니다.
명령프롬프트에서 pip 프로그램을 사용해서 설치하겠습니다. pip 는 package installer for Python 의 약어로 파이썬 패키지 설치 프로그램입니다.
윈도우10의 명령프롬프트에서 아래와 같이 입력하면 설치를 시작합니다.
명령어를 입력하면 네트워크 repository 에서 다운로드 후 설치합니다.
python -m pip install pygame
아래와 같이 설치가 진행됩니다.
현재 파이게임의 버전이 2.0.1 이라는 것을 확인합니다.
(venv) C:\pythonProject>python -m pip install pygame Collecting pygame Downloading pygame-2.0.1-cp39-cp39-win_amd64.whl (5.2 MB) |████████████████████████████████| 5.2 MB 2.2 MB/s Installing collected packages: pygame Successfully installed pygame-2.0.1
파이게임이 잘 설치되었는지 확인해보겠습니다.
파이썬 IDLE를 열고 아래을 입력합니다.
import pygame
성공하면 아래와 같은 메시지를 볼 수 있습니다.
pygame 2.0.1 (SDL 2.0.14, Python 3.8.5) Hello from the pygame community. https://www.pygame.org/contribute.html
게임창 만들기
이제 게임창을 만들어 보겠습니다. 여기서 부터 파이게임 시작입니다.
게임을 흐름 과정으로 보면 윈도우창이 열리고 게임의 그래픽이 나오면 마우스나 키보드를 입력하여 화면에 나타나는 캐릭터들을 규칙에 따라 조작하는 과정입니다.
파이썬의 IDLE에서 소스코드 에디터에 입력하여 실행합니다.
import pygame screenSize = (400, 300) gameScreen = pygame.display.set_mode(screenSize) pygame.init() pygame.quit()
위의 코드를 실행하면 너비가 400 높이가 300인 윈도우창이 화면에 나타났다가 순식간에 사라지는 것을 볼 수 있습니다.
방금 실행한 것이 파이게임의 실행과 종료입니다.
게임은 아직 시작도 안했는데 왜 이렇게 빨리 나왔다가 사라지는걸까요?
게임창이 열리는 시점은 set_mode 함수를 실행하는 시점입니다.
그 후 게임창이 바로 소멸되는 이유는 pygame.init()으로 게임을 초기화 한 다음 pygame.quit() 으로 윈도우창을 소멸시켰기 때문입니다.
프로그램은 소스코드의 위에서부터 아래로 순차적으로 실행됩니다. 단순히 프로그램의 끝에 도달했기 때문에 정상적으로 종료한 것 입니다.
사실 pygame.quit() 명령어가 없어도 종료가 되는 것은 마찬가지 입니다. pygame.init()은 파이게임을 초기화 시킨 윈도우창을 만들 뿐 그것을 유지하지는 않습니다.
윈도우창이 종료되지 않고 게임을 계속하기 위해서는 게임루프 상태를 유지시켜줘야 합니다. 게임이 지속적으로 돌아가면서 플레이어와 상호작용할 수 있는 상태를 게임루프라고 합니다.
게임루프 구조
일단 게임창이 열리면 아래의 그림처럼 루프(순환)를 돌기 시작합니다. 게임의 화면을 그리고(Draw Screen) 게임안에서 일어난 일을 처리합니다. (Handle Events) 그리고 게임의 상태를 업데이트하고(Update Game State)
게임을 끌 때까지 반복되는 게임루프가 사용되고 있습니다. 전원버튼을 누르기 전에는 플레이어가 게임을 조작할 수 있어야 합니다.
게임루프는 무한 루프입니다(infinite loop) 하드웨어의 성능에 따라 1초에 몇천번도 루프를 합니다만, 모니터에서 바뀌는 화면을 사람의 눈이 인식하는 한계가 있기 때문에 1초에 60번 정도의 타이밍으로 게임을 제작합니다. 3D게임에서 말하는 60FPS (Frame per Second)와 같은 개념은 여기서 나왔습니다.
2D게임은 그만큼 프레임을 사용한 게임이 거의 없기 때문에 게임 유저입장에서 신경쓸일이 아니지만 2D게임도 타이밍을 설정하는 기준은 같습니다. 1초에 이미지를 6-7개 정도 사용해서 한 장당 10분의 1초 정도 보여주는 것입니다. 움직임이 다르게 보이는 것은 2D의 이미지가 적기 때문입니다.
2D도 1초에 60개 이미지를 사용하면 3D만큼 부드러워지지만 비용이 올라가기 때문에 사용게임에서 보기는 힘듭니다.
위의 그림이 1초에 60번 일어난다고 생각하면 이해가 쉬울 것 입니다. 1초에 60번 모니터에 이미지를 그린다는 것은 이벤트처리도 60번, 게임상태의 업데이트도 60번 일어난다는 것 입니다. 1분이면 3600번의 게임 루프를 도는 것인데요.
그럼 이제 게임루프(Game Loop)의 구조를 이해하기 위한 코드를 실행해보겠습니다. 아래의 코드를 실행하면 무한루프를 돌면서 이벤트를 발생시킵니다.
마우스를 위에 올리고 움직여 보면 루프카운터가 증가하면서 포착된 이벤트를 콘솔화면에 출력하기 시작합니다.
import pygame import sys screenSize = (400, 300) gameScreen = pygame.display.set_mode(screenSize) pygame.init() gameloopCount = 0 running =True while running: for event in pygame.event.get(): gameloopCount += 1 print(gameloopCount, ":", event) if event.type == pygame.QUIT: running = False pygame.quit() sys.exit()
몇초동안 마우스를 흔들어보니 벌써 1315번 이벤트가 발생했습니다. 가만히 있으면 이벤트 루프는 돌지만 콘솔에 출력하지는 않습니다.
메시지를 유심히 보면 마우스가 윈도우를 떠날 때 Window Leave 이벤트를 발생시키고, 키보드를 누를 때 KeyDown 이벤트를 발생시키는 등 게임창에 입력한 행동에 따라 다른 이벤트가 발생된다는 것을 볼 수 있습니다.
마우스가 이동할 때는 정확한 좌표값도 출력합니다.
Pygame은 프로그래머가 게임을 제작하기 위한 기본 툴을 제공하는 모듈입니다. 게임 프레임워크라고도 합니다.
기본은 SDL이라는 C언어에 기반한 미디어 라이브러리를 파이썬에 바인딩 Binding 모듈입니다.
그래서 파이썬의 쉬운 문법으로도 게임제작에 필요한 자원들을 사용할 수 있습니다.
파이게임 공식 웹사이트에는 아마추어들이 개발한 게임의 소스가 많이 올라와있습니다. 대부분 오픈소스로 열람이 가능하니 새로운 게임을 만들 때 참고하기에 좋습니다.
코드설명
import pygame – 파이게임 모듈을 사용합니다. import sys – 시스템 관련 모듈을 사용합니다. gameScreen = pygame.display.set_mode(screenSize) – 스크린 사이즈에 따라 게임창을 설정합니다. pygame.init() – 파이게임을 초기화합니다. gameloopCount = 0 – 카운터로 사용합니다. running =True – 이것으로 무한루프를 만듭니다. while running: – 무한 루프를 돕니다. for event in pygame.event.get(): – 무한 루프안에서 발생한 이벤트를 검사합니다. 이벤트가 발생하면 event 변수에 저장합니다. print(gameloopCount, “:”, event) – 발생한 event 를 콘솔에 출력합니다. if event.type == pygame.QUIT: running = False – 윈도우창을 종료할 때 이벤트 처리기. 무한루프를 종료합니다. pygame.quit() sys.exit() 파이게임을 종료하고 운영체제로 복귀합니다.
요약
간단히 파이게임 시작에 대하여 알아봤습니다.
설치, 테스트, 게임창 실행 그리고 게임루프를 봤는데요
특별한 것은 없습니다. 내부적으로 보면 게임도 윈도우 GUI 프로그래밍과 비슷한 프로그램입니다.
외부참조문서
GettingStarted – pygame wiki 파이게임 시작하기 공식 API