Lecture 이미지와 시간

Views 195 • Comments 0 • Last Updated at 7 months ago Full screen  
  • 파이게임
  • 파이게임

이미지 로딩

파이게임에서 이미지를 로딩은 pygame.image 모듈이 있다. 특정한 이미지를 로딩은:

image_surf = pygame.image.load("myimage.bmp").convert()

이미지 읽고 표현하기

screen = pygame.display.set_mode(스크린크기)
p_img = pygame.image.load(이미지이름)  #1
p_img = pygame.tranform.scale(p_img, 새로운 크기)  #2
while True:
   screen.blit(p_img,위치) #3
   pygame.display.update()
pygame.quit()
  • 1 : 이미지를 로드한다. 이미지이름에는 위치도 포함된다.
  • 2 : 이미지의 크기를 원하는 크기로 조정한다.
  • 3 : blit함수는 그림을 위치에 그려준다.

예제

# pg_init07.py

import pygame
from pygame.locals import *
 
pygame.init()
screen = pygame.display.set_mode((500,400))
clock = pygame.time.Clock()

p_img = pygame.image.load('tiger.bmp')
#p_img = pygame.transform.scale(p_img, (100,100))

white = (255,255,255)
black = (0,0,0)
x = 0
y = 0
vel = 5

running = True
left_key, right_key, up_key, down_key = False, False, False, False

while running:
    clock.tick(60)  
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.KEYDOWN:  #1
            if event.key == pygame.K_LEFT:
                left_key = True
            if event.key == pygame.K_RIGHT:
                right_key = True
            if event.key == pygame.K_UP:
                up_key = True
            if event.key == pygame.K_DOWN:
                down_key = True
        if event.type == pygame.KEYUP:  #2
            if event.key == pygame.K_LEFT:
                left_key = False
            if event.key == pygame.K_RIGHT:
                right_key = False
            if event.key == pygame.K_UP:
                up_key = False
            if event.key == pygame.K_DOWN:
                down_key = False            
            
    if left_key:
        x = x - vel
    if right_key:
        x = x + vel
    if up_key:
        y = y - vel
    if down_key:
        y = y + vel
    
    screen.fill(white)
    screen.blit(p_img, (x,y))  #3
    pygame.display.update()
pygame.quit()
  • 키가 눌려있는 동안 vel의 픽셀 만큼 움직인다.
  • 키가 떨어지면 움직임이 없어진다.
  • 이미지의 위치(x,y)에 그림을 그려진다.

배경화면 만들기

  • 배경화면은 이미지를 읽어 들여 창의 크기와 같게 만들면 배경화면이 된다.
import pygame
 
screen = pygame.display.set_mode((500,400))
bg = pygame.image.load("배경이미지.jpg")
bg = pygame.transform.scale(bg, ('사이즈'))  #배경 이미지를 창의 크기에 맞게 스케일을 바꿔준다. 

running = True

while running:
   for event in pygame.event.get():
      if event.type == pygame.QUIT:
         running = False
   screen.fill(white)
   screen.blit(bg, (0,0))
   
pygame.quit()  

tick함수

위 예제에서 tick(숫자)에서 괄호안의 숫자는 fps(frame per seconds)로 일초당 프레임 수를 나타낸다. fps가 5일때의 그림의 움직임이 부자연스러움이 보이지만 60일때는 그림의 움직임이 자연스럽다.

fps에 따라 캐릭터의 이동 속도가 달라진다. 캐릭터의 이동은 while문이 한번 실행될때마다 vel만큼 이동된다. 1초에 while문이 fps만큼 실행되니 캐릭터 이동 속도는 fps의 역수가 곱해져야 한다.

# fps가 dt=1/fps  x = x + vel * dt
# pg_image_01.py

import pygame
import time
import numpy as np

pygame.init()

win = pygame.display.set_mode((500,400)) #1
 
pygame.display.set_caption('두번째 예제') #2

x = 0
y = 0
white, black = (255,255,255), (0,0,0)
vel = 5
left_key, right_key, up_key, down_key = False, False, False, False
im = pygame.image.load('tiger.bmp')
im_resize = pygame.transform.scale(im, (100,100))
clock = pygame.time.Clock()
count = True
fps = 50
dt = 10/fps
running = True
while running:
    #pygame.time.delay(20)
    clock.tick(fps)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
            break
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                left_key = True
            elif event.key == pygame.K_RIGHT:
                right_key =True
            elif event.key == pygame.K_UP:
                up_key =True
            elif event.key == pygame.K_DOWN:
                down_key =True
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT:
                left_key = False
            elif event.key == pygame.K_RIGHT:
                right_key = False
            elif event.key == pygame.K_UP:
                up_key = False
            elif event.key == pygame.K_DOWN:
                down_key = False
    if left_key:
        x -= vel*dt
    if right_key:
        x += vel*dt
        if count:
            ts = time.time_ns()
            count = False
    if up_key:
        y -= vel*dt
    if down_key:
        y += vel*dt
    if x > 400:
        ts = (time.time_ns() - ts)/1000000
        print(f'elapsed time : {ts}[ms]') 
        running = False
    win.fill(white) #7
    win.blit(im_resize,(x,y))
    pygame.display.update() #5
pygame.quit() #3 
previous article
next article
Comments
Feel free to ask a question, answer or comment, etc.