노는게 제일 좋습니다.

pygame엔진 Hello world 본문

Python/기타 공부

pygame엔진 Hello world

노는게 제일 좋습니다. 2016. 2. 6. 03:07

pygame을 설치한다고 고생좀 했다.


특정한 모듈을 찾을 수 없네, 제대로 된 실행파일이 아니네 오류를 죄다 겪어봤다.


해결방법은 단순하다. 파이썬과 pygame모두 32bit로 설치하고, 둘의 버전을 일치시켜야 한다.

예를들어, pygame이 파이썬3.4를 대상으로 하면, 파이썬은 3.4.x버전으로 설치해야 한다.


책을 따라 63라인을 타이핑했다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import pygame
import sys
from pygame.locals import *
 
pygame.init()
 
windowSurface = pygame.display.set_mode((500,400), 032)
pygame.display.set_caption('글쿤')
 
BLACK = (0,0,0)
WHITE = (255,255,255)
RED = (255,0,0)
GREEN = (0,255,0)
BLUE = (0,0,255)
 
basicFont = pygame.font.SysFont(None,48)
 
text = basicFont.render('Hello world!', True, WHITE, BLUE)
textRect = text.get_rect()
textRect.centerx = windowSurface.get_rect().centerx
textRect.centery = windowSurface.get_rect().centery
 
windowSurface.fill(WHITE)
 
pygame.draw.polygon(windowSurface, GREEN, ((146,0), (291,106), (236,277), (56,277), (0,106)))
 
pygame.draw.line(windowSurface, BLUE, (60,60), (120,60), 4)
pygame.draw.line(windowSurface, BLUE, (120,60), (60,120))
pygame.draw.line(windowSurface, BLUE, (60,120), (120,120), 4)
pygame.draw.circle(windowSurface, BLUE, (300,50), 200)
pygame.draw.ellipse(windowSurface, RED, (300,250,40,80), 1)
pygame.draw.rect(windowSurface, RED, (textRect.left - 20, textRect.top - 20, textRect.width + 40, textRect.height + 40))
 
pixArray = pygame.PixelArray(windowSurface)
pixArray[480][380= BLACK
del pixArray
 
windowSurface.blit(text, textRect)
pygame.display.update()
 
while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
 
cs


** 팁

모듈이름은 소문자로 시작하고, 데이터타입 이름은 대문자로 시작한다.



  pygame.init()

초기화 코드. pygame함수를 호출하기 전에 수행해야 함.


  pygame.display.set_mode()

인수가 세 개 들어감. 첫 번째는 윈도우 크기를 나타내는 튜플. 두 개의 정수가 들어가며, 너비,높이 순임.

두 번째는 color depth라고 하고, 세 번째는 아예 설명도 안해줘서 모르겠음.


  set_caption()

pygame.Surface객체를 반환.  프로그램의 가장 위의 캡션 내용을 바꾸는 것 같음.


  색깔 설정

3개의 정수로 된 튜플로 RGB를 나타낸다. (빨강, 초록, 파랑) 순이다.


  pygame.font.SysFont()

SysFont()함수 호출로 pygame.font.Font객체를 만들 수 있다.SysFont에는 두 개의 파라미터가 들어간다.

첫 번째 파라미터는 폰트의 이름이다. None이면 OS의 기본 폰트를 사용한다.

두 번재 파라미터는 폰트 크기이다.


  font객체 renter()메소드

Font객체.renter(그리고자 하는 문자열, 안티엘리어싱, 글자색, 배경색)

네 개의 매개변수가 들어간다. 첫 번째는 그릴 문자열.

두 번째는 안티엘리어싱 사용 여부. True이면 사용하고, False이면 사용하지 않는다.

세 번째,네 번째는 직감상 알아낸 것이다. 세 번째는 글자색이며, 네 번째는 글자를 둘러싼 사각형의 배경색이다.


  pygame.Rect 데이터타입

사각형이다. attribute들도 잔뜩있다. attribute의 한 값을 바꾸면 나머지가 자동으로 갱신된다.

attribute의 예로는 centerx, centery.

생성자는 pygameRect(left, top, width, height) . left는 가장 왼쪽의 x좌표, top은 가장 위의 y좌표이다.


  get_rect() 메소드

Font객체, Surface객체에 둘 다 있다. 하는 일은 같다. pygame.Rect객체를 반환한다.


  type()메소드.

매개변수로 어떤 데이터를 넣으면 데이터타입을 알 수 있다. 반환값은 type 데이터 타입의 값이다.

(문자열 아님)


  Surface객체 fill() 메소드

색칠하는 함수. 매개변수로 색이 들어감.


  pygame.draw.polygon() 함수

다각형을 그린다. 다각형은 직선으로만 이루어지며, 원과 타원은 다각형에 속하지 않는다.

매개변수는 (Surface객체, 색깔, 좌표)

좌표는 x,y 두 개의 숫자로 이루어진 튜플의 튜플로 넘겨준다.

예를들어, ( (0,0), (500,200), (200,100) ). 마지막 값은 자동으로 첫 번째 값과 연결해 닫힌 다각형을 그리게 된다.


  pygame.draw.line()함수

선을 그린다. 글쿤. 매개변수는 (Surface객체, 색깔, 시작점, 끝점, 굵기)

시작점과 끝점은 (0,0) 라던지 (500,200)같은 x,y값 두 개를 담은 튜플로 넘겨준다.

마지막 매개변수인 '굵기'는 아예 넘기지 않으면 1로 자동으로 넘어간다.


  pygame.draw.circle() 함수

원을 그린다. 놀랍군. 매개변수는 (Surface객체, 색깔, 원의 중심, 반지름, 색칠여부)

원의 중심은 (x,y)튜플로 넘겨준다. 반지름은 픽셀단위.

색칠여부는, False(0)의 경우 넘겨준 매개변수중 색깔로 안쪽에 색칠을 한다. True(1)이면 색칠하지 않는다.


  pygame.draw.ellipse() 함수

타원을 그린다. 매우 놀랍다. 매개변수는 (Surface객체, 색깔, 타원이 들어갈 Rect, 색칠여부)

타원을 그릴 좌표는 타원이 들어갈 사각형으로 지정해준다.

타원이 들어갈 Rect는 그냥 Rect()생성자처럼 네 개의 값을 담은 튜플로 넘겨준다. 아래와 같다.

(left, top, width, height)


  pygame.draw.rect() 함수

사각형을 그린다. 우와 놀랍다! 매개변수는 (Surface객체, 색깔, Rect객체 또는 (left,top,width,height) 네 정수 튜플 )

세 개 들어간다.


  pygame.PixelArray 데이터 타입

한국어판 책에서 색깔튜플의 리스트의 리스트로 넘겨준 Surface객체라는데 뭔소린지 모르겠다.

그냥 pygame.PixelArray(Surface객체) 로 Surface객체의 색깔 배열들을 가져온 다음

pixelArray변수[x좌표][y좌표] 로 색깔에 접근할 수 있다는것까지만 알겠다.

-> 만약 pixelArray객체를 만들게 된다면 그 Surface객체를 잠그게 된다. 잠긴 Surface에는 blit함수를 사용할 수 없다.

잠금을 해제하기 위해서는 del연산자로 PixelArray객체를 지우면 된다.


  Surface객체.blit() 메소드

한 Surface객체상의 내용을 다른 Surface객체상에 옮겨그린다.

매개변수 두 개 들어감. (옮길 내용, 표시할 위치)


  pygame.display.update()함수

그린 내용들을 화면에 표시함. 하기 전에는 메모리 상에서만 작업이 이루어짐.


  게임루프.

1)개념

pygame은 게임루프라는 반복문 안에서 모든 코드를 수행한다.(초당 약 백번)

계속해서 반복하며 새로운 이벤트가 있는지 검사하고 윈도우의 상태를 갱신하여 화면에 윈도우를 그린다.

http://ddolddoly.tistory.com/56 의 그림 참고.

이벤트는 pygame.event.Event타칩 객체. 특정 사건이 일어날 때 Pygame에서 발생시킴.


2) 이벤트 얻기

시간이 A->B>C로 흐른다고 하자.

A에서 처음으로 pygame.event.get()을 호출했다고 하자.

그리고 시간이 지나 B에서 다시 호출했다. 이 경우 A에서 B 사이 시간에서 일어난 이벤트들을 가져오게 된다.

다시 C에서 호출하면 B와 C사이의 이벤트들을 가져온다. 이렇게 이벤트를 가져와 리스트로 반환한다.

모든 이벤트는 type 이라는 attribute를 가지는데, 이것으로 어떤 종류의 이벤트인지 알 수 있다.


3) QUIT이벤트

윈도우 우측상단 X를 누르거나 강제종료 하는 등 프로그램을 중지해야 할 때 발생하는 이벤트이다.


4) 프로그램 끝내기

pygame.quit()

sys.exit()



  참고해보면 좋을 자료.

http://devnauts.tistory.com/61


surface가 무엇인가에 대해 감잡기 위한 자료

http://thepythongamebook.com/en:pygame:step003

Surfaces

Please note that despite the name the ball surface is a rectangular surface.

뭔말인지 모르겠지만 일단 ball이라는 이름을 가진놈에 주목해야 될 것 같다. ...아마도 아래 검은 사각형인듯.

Onto this surface the program draws a blue circle.

이 Surface에는 프로그램이 푸른 원을 그린다.

Because the ball surface was not filled like the background surface, it remains black (Red Green Blue value: (0,0,0)).

왜냐면.. ball이 배경처럼 색칠되어있지 않기 때문이죠. 이것은 검은색인채로 남아있다. 이쯤되니 내 해석이 의문이 든다.

Also note that in this program nothing is blitted inside the mainloop, all painting and blitting occurs before the mainloop.

또한 주목해라. .. 음... 이건.. pygame의 게임루프 시스템 이야기인듯..


The ball is visible on the screen because the background was blitted first and then the background the ball surface was blitted (quasi-on-top). Reverse the order of blitting and you should see only the white background. Blitting the background on the screen is a good method to clean all graphic artefacts from a screen.


여기서 볼 때, 도형들에 Surface라는 말을 쓰는 것으로 보아,

그림들은 모두 Surface로 취급하는것 같은데 아직 잘 모르겠다.




파이게임 레퍼런스의 Surface에 대한 설명 링크

http://www.pygame.org/docs/ref/surface.html

pygame.Surface

class pygame.Surface
pygame object for representing images









Comments