###


회사 퇴사하고나서 시간이 비길래 주말엔 게임개발을 해보기로 했음.


근데 그냥 나혼자서 겜게발하면 100% 흐지부지 될게 뻔하기 때문에


여기다가 개발일지겸 자기만족용 일기용으로 글을 써보기로 함.


내가 쓸 코딩언어는 파이썬의 파이게임인데, 기본적으로 파이썬의 구조에 대해서 조금은 이해도가 있어야 사용가능함.


참고로 파이썬 자체는 매우 쉬운편이니 배우는걸 추천함.




###


1. 파이게임이란?


파이게임은 파이썬을 기반으로 만든 모듈임.


그렇다면 모듈이 뭐냐? 쉽게 말해서 모듈은 게임으로 치면 유저모드 같은 존재임.


유저모드라는것은 대체로 그 게임의 원판 규칙을 유지한체로 새로운 기능을 추가하는거잖아?(종종 상식을 뛰어넘는것도 있겠지만)


그런것 처럼 파이썬의 모듈도 파이썬 자체로도 파이게임에서 사용하는 함수들을 다 구현할순 있지만


이런 함수들을 일일이 제작해서 사용하려면 복잡해지니 이걸 모듈이라는 걸로 담아둔거임.


2. 파이게임 추천 툴


일단 내가 추천하는 툴은 Visual studio임. 파이썬 모듈은 편하긴 한데 설치 및 관리가 귀찮다는 단점이 있음.


다른 파이썬 추천툴들도 많긴 하지만 비주얼스튜디오의 강점은 모듈 설치가 진짜 편함.


걍 이름검색해서 설치하면 다임.



viewimage.php?id=2abcdd23e1d72ea362b0c6&no=24b0d769e1d32ca73fee8efa11d02831027538f7794a651c79560564d4405417190eaeac29dc6141f30d1c1f2dff9f7db7531b3d40e72c78b6ebd1078c9555cf00d7f4d3e044

일단 이 글을 보고 파이게임에 도전해볼 사람이라면 일단 비주얼스튜디오를 깔고(심지어 설치단계에서 파이썬을 따로 설치해주니까 별도의 설정이 필요없음.)


파이썬 환경에서 개요 -> pygame을 검색 -> 클릭하여 설치 하자. 이러면 일단 시작단계는 끝난것임.


3. 실제로 화면을 띄워보자!


이제부터는 간단한 예제코딩 설명이 될텐데, 파이썬을 모르거나 아예 프로그래밍 언어를 배운적이 없는 사람들이라면 이해가 어려울수 있음.


그래도 최대한 간단하게 설명하려고 노력할테니까 일단 따라와보자.


기본목표는 일단 게임화면 만들기. 그것도 가장 단순하게 하얀색밖에 없는 빈 화면을 띄우는것임.


비쥬얼스튜디오에 아래의 코드를 입력하고 F5를 눌러보자.


###

import pygame


WHITE = (255, 255, 255)

pad_width = 740

pad_height = 370


def runGame():

global gamepad, clock


end_game = False

while not end_game:

for event in pygame.event.get():

if event.type == pygame.QUIT:

end_game = True


gamepad.fill(WHITE)

pygame.display.update()

clock.tick(60)


pygame.quit()


def initGame():

global gamepad, clock


pygame.init()

gamepad = pygame.display.set_mode((pad_width, pad_height))

pygame.display.set_caption('Hello_World')


clock = pygame.time.Clock()

runGame()


initGame()


###


viewimage.php?id=2abcdd23e1d72ea362b0c6&no=24b0d769e1d32ca73fee8efa11d02831027538f7794a651c79560564d4405417190eaeac29dc6141f30d1c1f2dff9f7db7531b3d40e72c78b6ebda008a9656ca557c4b885c14

위의 내용을 입력해서 실행에 성공한다면 다음의 창이 떠야 정상임.


만약 실행이 안된다면 자신의 오탈자, 칸간격, 대소문자등을 집중해서 살펴보도록 하자.


참고로 파이썬은 행마다의 칸 간격이 가장 중요한데, 그 이유는 칸 간격에 따라 내용의 묶음과 순서가 달라지기 때문이야.


1. ~~~~

2. ~~~~

3. ~~~~


이런식의 배열이 있다면, 3이 시행되고 끝남. 1과 2를 시행시키려면 일단 3의 행에 1번을 시행시킨다는 내용이 있어야 1번으로 넘어가는 구조이지.


이제 위의 내용이 무슨뜻인지 하나하나 뜯어보기로 하겠음.


3. 내가 대체 뭘한거지??


import pygame -> 프로그래밍 툴에게 '파이게임이란 모듈 설치해라!'라고 지시한거임.


WHITE = (255, 255, 255)

pad_width = 740

pad_height = 370

-> WHITE, pad_width, pad_height 라는 변수를 설정한것임.

사람들이 1을 '일'이라고 읽기로 약속한것처럼, 컴퓨터에게 앞으로 "WHITE"는 (255, 255, 255)로, pad_width 는 740로, pad_height 는 370로 부르기로 한거지.

참고로 RGB에 대해서 잠깐 설명할께. RGB는 빛의 3원색인 빨강 초록 파랑을 말하는데, RGB의 각자 값을 최대치인 255로 섞으면 우리가 일반적으로 보는 하얀색이 나와. 반대로 검은색의 경우엔 빛을 죄다 차단해버리면 검은색이 나오겠지?

이 값을 변경해두면 자기가 원하는 색상으로 변경할수 있어.


def runGame(): -> 이것도 툴에게 "runGame()이란 명령을 치면 아래의 내용을 시행해라!"라고 약속한거야.

def는 영어 definition을 생각해봐. 이 영어는 정의라는 뜻이지? runGame()이란 단어가 무슨 뜻인지 정의한거라고 이해하면 되.


global gamepad, clock

-> 전역변수라는것인데, 만약 runGame()명령 밖에서도 gamepad, clock이란 변수를 사용해야할 경우가 생길때 적어두는거야. 이걸 먼저 적고 변수를 설정해도 아-무런 상관 없음.


end_game = False

while not end_game:

for event in pygame.event.get():

if event.type == pygame.QUIT:

end_game = True

->일단 end_game은 False라는 값을 변수로 저장해둠.

그리고 while not end_game:은 end_game이 False값일때, 라는 말임.

for event in pygame.event.get(): 이건 사용자(여기선 게임하는 유저겠지?)가 발생한 이벤트, 즉 입력값을 event에 변수로서 저장하겠다는 말이지.

그리고 for은 event에 저장된 변수를 지속적으로 확인해주는 역활을 해.

if은 영어에서 사용되는 그 if문이야. 만약 event의 타입이 pygame.QUIT과 같다면, end_game의 값을 True로 바꿔라, 라는 명령어야.

그리고 pygame.QUIT은 파이게임에 저장된 이벤트 타입으로, 사용자가 X버튼(일반적으로 종료버튼에 해당되는 그것)을 누르는것을 말해.


gamepad.fill(WHITE)

pygame.display.update()

clock.tick(60)

-> WHITE라는 변수를 gamepad.fill이라는명령어에 대입한다는 뜻이야.

그리고 pygame.display.update()은 디스플레이, 즉 화면을 업데이트, 즉 갱신하라라는 의미야.

우리가 TV를 볼때, 이 화면이 무수한 장면들이 연속적으로 이어져서 보이는거잖아?

그거랑 같은거지.


이 주기는 clock.tick(60), 즉 60프레임이 설정되었어.

근데 당연히 이거 1번의 명령으론 연속적인 화면송출이 불가능하겠지?

그래서 while과 for이 필요한거야. while not은 end_game이 False인 이상 계속 for로 넘길테고, for은 X버튼을 클릭한걸 확인할때까지 디스플레이 업데이트를 시행해 주거든.


pygame.quit()

-> 이건 종료명령에 해당됨. 아까의 for가 반복적인 기능을 담당하고, while not은 "~가 False일때" 라는 조건이라고 했지? for에서 X버튼을 클릭한 결과값이 대입된다면 end_game의 변수값이 True로 바뀌고, 이건 end_game값이 True가 되었기 때문에 while의 조건이 깨져서 다음으로 넘어갈수 있도록 하는거야.

즉 end_game이 True가 된다면 quit명령이 시행되서 종료가 되는거임.


def initGame():-> 아까 runGame()에서 설명했으니 넘어갈께.

global gamepad, clock


pygame.init()

-> 파이게임 모듈을 시동거는 명령어야. 쉽게 말하자면 pygame 모듈의 init에 설정된명령을 전부 셋업한다고 보면 되겠네.

이걸 잊어버리면 일부 명령어가 실행되지 않는다고 함.


gamepad = pygame.display.set_mode((pad_width, pad_height))

-> display.set_mode는 pygame에 있는 창설정 명령어야. pad_width, pad_height를 대입한 명령어의 결과값을 gamepad라는 변수에 저장한거지.


pygame.display.set_caption('Hello_World')

->display.set_caption은 말 그대로, 프로그램 창의 윗단에 Hello_World라는 캡션이 뜨도록 설정한거야. 일반적으론 제목표시줄이라고 이해하면 되겠네.


clock = pygame.time.Clock()

->pygame에 저장된 time.Clock()함수의 결과값을 clock이란 변수에 저장한거네.


runGame()

-> 마지막으로 runGame()함수를 시행하는걸로 initGame()함수는 끝나.


initGame()

->initGame()명령을 시행시켜.


아까도 말했지만, 파이썬에선 칸의 간격에 따라 명령의 시행순서가 달라져!!


전체 내용의 명령순서를 다시 설명하자면 다음과 같아.

(1) pygame이란 모듈을 설치!

(2) WHITE, pad_width, pad_height의 변수를 설정!

(3) def runGame()을 시행!

(4) def initGame()을 시행!

(5) initGame()을 시행!

(6) initGame()의 내용이 끝났다면, runGame()을 시행!(initGame()에 시행하란 내용이 담겨져 있음.)

(7) end_game 변수를 False로 설정!

(8) while체크, for체크로 end_game의 값을 재설정하고, 계속 False라면 디스플레이를 업데이트함!


휴... 먼가 설명이 길어져서 힘드네. 일단 가장 기초적인 화면띄우기가 끝났어.

다음엔 이 화면에 뭔갈 띄어볼까해. 근데 이거하나 설명하는데 이정도나 오래걸리다니... 다음글을 쓸순 있을까? 흑흑...