강의노트 pygame 시작하기 2

강의노트 • 조회수 149 • 댓글 0 • 수정 2주 전  
  • 파이게임
  • 파이게임

파이게임이란?

Pygame은 게임 개발자와 파이썬 프로그래머들에게 게임 프로토타이핑부터 전체적인 게임 개발에 이르기까지 다양한 기능을 제공합니다.

그래픽 처리, 키보드 및 마우스 입력, 사운드 재생, 애니메이션, 충돌 감지 등을 포함하여 게임에서 필요한 기능을 구현할 수 있습니다.

파이게임 기본 구조

파이게임의 기본 동작은 아래 그림과 같이 이벤트를 처리하고 상태를 업데이트한 후 화면을 업데이트한다. 위의 과정을 무한 반복한다.

이를 코드로 나타낸 것이 다음과 같다.

import pygame   #1
pygame.init()   #2
게임창 설정      #3
while True:
   이벤트 체크   #4
   반복 움직임   #5
   게임창 그리기 #6
pygame.quit()    #7
  1. 파이게임 라이브러리를 읽어온다.
  2. 파이게임을 초기화 한다. 클래스의 생성자 함수와 같다.
  3. 게임창을 설정한다. while문을 무한 반복한다.
  4. 이벤트를 체크한다.
  5. 상태를 업데이트한다.
  6. 화면을 업데이트한다.
  7. 무한 반복을 끝난 후 파이게임을 종료한다.

새로운 라이브러리를 이해하는 가장 좋은 방법은 예제를 활용하는 것이다.

예제

import pygame
pygame.init()
pygame.display.set_mode((500,500))
pygame.display. set_caption("Pygame_Test 1!")
import pygame
import sys
# screen 이라는 이름의 변수를 사용하여 새로운 창 개체 생성
screen = pygame.display.set_mode((400, 400))
pygame.display.set_caption('배경색을 파랑으로∼ !')
# screen 이라는 이름을 가진 창의 배경색을 파랑으로 설정
screen.fill((0, 0, 255))
# 샘성된 장에 설정된 값 표기 => 창 업데이트
pygame.display.flip()
running =True
while running:
    for event in pygame.event.get( ):
        if event.type == pygame.QUIT:
            running = False
pygame.quit( )

예제1

# Example file showing a basic pygame "game loop"
import pygame

# pygame setup
pygame.init()
# 창의 크기를 변경 가능하게 함
screen = pygame.display.set_mode(size = (1280, 720), flags = pygame.RESIZABLE)
clock = pygame.time.Clock()
running = True

while running:
    # poll for events
    # 모든 이벤트를 검사
    for event in pygame.event.get():
        # pygame.QUIT event means the user clicked X to close your window
        # 이벤트 유형이 quit이면 
        if event.type == pygame.QUIT:
            running = False

    # fill the screen with a color to wipe away anything from last frame
    # 화면을 지정한 색으로 칠한다
    screen.fill("purple")

    # RENDER YOUR GAME HERE

    # flip() the display to put your work on screen
    # 전체 화면의 내용을 업데이트한다
    pygame.display.flip()

    clock.tick(60)  # limits FPS to 60

pygame.quit()

예제2

w,s,a,d 키보드를 누르면 원을 움직인다.

# Example file showing a circle moving on screen
import pygame

# pygame setup
pygame.init()
screen = pygame.display.set_mode((1280, 720))
clock = pygame.time.Clock()
running = True
dt = 0

# 위치를 벡터로 만듬
player_pos = pygame.Vector2(screen.get_width() / 2, screen.get_height() / 2)

while running:
    # poll for events
    # pygame.QUIT event means the user clicked X to close your window
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    # fill the screen with a color to wipe away anything from last frame
    screen.fill("purple")

    pygame.draw.circle(screen, "red", player_pos, 40)

    keys = pygame.key.get_pressed()
    if keys[pygame.K_w]:
        player_pos.y -= 300 * dt
    if keys[pygame.K_s]:
        player_pos.y += 300 * dt
    if keys[pygame.K_a]:
        player_pos.x -= 300 * dt
    if keys[pygame.K_d]:
        player_pos.x += 300 * dt

    # flip() the display to put your work on screen
    pygame.display.flip()

    # limits FPS to 60
    # dt is delta time in seconds since last frame, used for framerate-
    # independent physics.
    dt = clock.tick(60) / 1000

pygame.quit()

예제3

import sys, pygame 
pygame.init() 

size = width, height = 320, 240  
speed = [2, 2] 
black = 0, 0, 0

screen = pygame.display.set_mode(size) 

#  공 이미지를 로드* 하여 볼 데이터가 있는 Surface를 반환한다
ball = pygame.image.load("ball.png") 

# 공 이미지의 크기를 변경한다
ball = pygame.transform.scale(ball, (20,20)) 
# 볼 이미지를 사각형 변수 ballrect에 반환한다
ballrect = ball.get_rect() 
clock = pygame.time.Clock()

# 무한루프 실행
run = True
while run: 
    clock.tick(60)
    for event in pygame.event.get():  
        if event.type == pygame.QUIT:
            run = False

    # ballrect 변수를 현재 속도만큼 이동한다
    ballrect = ballrect.move(speed) 
    # 벗어나는 범위에 있는지 확인하고 벗어나면 속도의 방향을 바꾼다
    if ballrect.left < 0 or ballrect.right > width:
        speed[0] = -speed[0]
    if ballrect.top < 0 or ballrect.bottom > height:
        speed[1] = -speed[1]

    screen.fill(black) 
    # 공과 ballrect를 그린다
    screen.blit(ball, ballrect) 
    # 화면을 업데이트한다
    pygame.display.flip() 
pygame.quit()    
  • SDL_image 라이브러리를 통해 BMP, JPG, PNG, TGA, GIF를 포함한 다양한 이미지 형식을 지원한다.

= 애니메이션은 일련의 단일 이미지에 불과하며, 순서대로 표시하면 인간의 눈을 속여 움직임을 보게 하는 것이다. 화면은 사용자가 보는 단일 이미지일 뿐이다.

= Pygame에는 키보드, 마우스, 조이스틱에 대한 입력 처리와 같은 작업을 수행하는 모듈도 있다. 오디오를 믹싱하고 스트리밍 음악을 디코딩할 수 있다. Surfaces를 사용하면 간단한 모양을 그리거나, 그림을 회전하고 크기를 조정하고, 심지어 numpy를 활용하여 이미지의 픽셀을 조작할 수도 있다. 대부분의 pygame 모듈은 C로 작성되고 실제로 Python으로 작성된 모듈은 거의 없다.

파이게임 이벤트 확인

예제 4

import pygame
pygame.init()  

# white, red, green, blue, yellow, magenta, cyan, gray, black =\
# (255,255,255), (255,0,0), (0,255,0), (0,0,255), (255,255,0), (255,0,255),
# (0,255,255), (128,128,128), (0,0,0)
#흰색, 빨강, 초록, 파랑, 노랑, 자홍색, 청록색, 회색, 검정
color = [(255,255,255), (255,0,0), (0,255,0), (0,0,255), (255,255,0),\
         (255,0,255),(0,255,255), (128,128,128), (0,0,0)]

# 게임 창 설정 크기, 캡션
screen = pygame.display.set_mode((500,400)) 
pygame.display.set_caption('첫번째 예제')

# 시간 및 변수 설정
clock = pygame.time.Clock() 

running = True
# 반복되는 게임 루프
while running:  
   # 시간 설정
   clock.tick(50) 
   
   # 모든 이벤트들을 검색
   for event in pygame.event.get():
      print(event) 
   
      if event.type == pygame.QUIT:
          running = False
         
   # 그림을 다시 그림     
   screen.fill(color[2])  
   pygame.display.update() 

# 게임창을 닫음
pygame.quit()  
  1. 모든 이벤트를 검색하고 출력한 결과는 다음과 같다.

예제 5

기본적인 틀로 키가 눌릴때마다 스크린의 색을 바꾸는 프로그램을 작성한다.

import pygame

pygame.init()   #1


color = [(255,255,255), (255,0,0), (0,255,0), (0,0,255), (255,255,0),\
         (255,0,255),(0,255,255), (128,128,128), (0,0,0)]

# 게임 창 설정 크기, 캡션
screen = pygame.display.set_mode((500,400))   
pygame.display.set_caption('첫번째 예제')

# 시간 및 변수 설정
clock = pygame.time.Clock()   

n = 0
running = True

# 반복되는 게임 루프
while running:   
   # 시간 설정
   clock.tick(50) 
   
   # 모든 이벤트들을 검색
   for event in pygame.event.get():  
      if event.type == pygame.QUIT:  
          running = False
      if event.type == pygame.KEYDOWN:
          n = n + 1
          n = n % 9
          
   # 창을 color[n]색으로 칠한다
   screen.fill(color[n])   
   # 파이게임 창을 업데이트한다
   pygame.display.update()   

# 창을 닫는다
pygame.quit()   
이전 글
다음 글
댓글
댓글로 소통하세요.