Image 화면에 나타내기 > Pygame - python GUI module

본문 바로가기
사이트 내 전체검색

회원로그인

올서베이넷
무료 온라인 설문 사이트
OVITII
웹 프레젠테이션 도구

Pygame - python GUI module

Image 화면에 나타내기

페이지정보

글쓴이 관리자 조회 43,328 조회 날짜 20-02-22 00:58 / Update:21-11-04 02:36
댓글 0 댓글

SNS 공유

  • 트위터로 보내기
  • 페이스북으로 보내기
  • 구글플러스로 보내기

내용

Image 화면에 나타내기

 

 

pygame의 스크린에서 움직이는 모든 객체는 이미지라고 해도 과언이 아니다. 

 

draw 메서드를 통해 line, rectangle, circle 등을 그릴 수 있지만, 이들 모두 surface 객체이며 surface 객체는 이미지로 보면 된다.

 

다시 말하면, 연속으로 움직이는 동작들은 게임 캐릭터, 미사일, 전투기, 자동차 등의 이미지를 연속적으로 화면에 보여주는 애니메이션이다. 

 

이번 강좌에서는 pygame에서 이미지를 불러와서 스크린에 복사하고, 화면을 갱신하는 과정을 알아본다.

 

 

 

1. Image 불러와서 객체로 저장하기

 

Image는 image.load() 메서드를 통해서 불러올 수 있다.

 

pygame.image.load("이미지 경로")

 

로딩할 수 있는 이미지의 종류는 아래와 같다.

 

JPG
PNG
GIF (non-animated)
BMP
PCX
TGA (uncompressed)
TIF
LBM (and PBM)
PBM (and PGM, PPM)
XPM

출처 : https://www.pygame.org/docs/ref/image.html

 

아래의 이미지를 다운받아 python 파일이 있는 폴더(디렉토리)에 Player.png로 저장한다.

 

2921044682_1582355973.8134.png

 

 

이미지 로딩후 저장

player = pygame.image.load("Player.png")

 

 

 

2. 이미지 크기 변경

 

이미지를 로딩하여 객체에 저장하면, 이미지 객체의 사이즈는 이미지의 원본 사이즈로 저장된다.

따라서 SCREEN에 맞게 크기를 조정해 줄 수 있다.

이미지 크기의 조정은 transform.scale() 메서드를 이용한다.

 

pygame.transform.scale(이미지객체, (width, height)) 

 

변경할 이미지의 가로, 세로 크기는 튜플로 지정한다.

 

이미지 로딩 후 크기를 변경하는 코드

player = pygame.image.load("Player.png")

player = pygame.transform.scale(player, (40, 102))

 

원본 크기 55 x 140 이미지를 40 x 102 사이즈로 화면에서 사용한다.

 

 

 

3. SCREEN 화면 배경색 변경하기

 

앞서 강좌에서 pygame의 display의 크기를 정해서 SCREEN 객체에 저장하였다.

SCREEN 객체의 기본 배경색은 검은색이다. 이를 흰색으로 변경한다.

배경색을 채우는 메서드는 fill( (RGB 색상) ) 이다.

 

RGB 색상 코드의 흰색은 (255, 255, 255) 이다. 

 

배경색 흰색으로 채우기 - 색상코드는 튜플로 입력

SCREEN.fill( (255, 255, 255) )

 

 

 

4. 이미지 화면에 출력하기

 

객체로 저장된 이미지는 화면상에 나타나지 않는다. 이를 SCREEN 객체에 복사해줘야 한다.

이미지를 SCREEN 객체로 저장하는 메서드는 blit( 이미지 객체,  이미지 좌표값) 이다.

 

이미지를 SCREEN 객체로 복사하기 - x, y 좌표값은 [리스트] 또는 (튜플), Rect로 입력가능

SCREEN.blit(player, [ 200, 250 ] )

 

위의 코드는 SCREEN 객체에 player 이미지를 좌표값 [200, 250] 위치에 복사하라는 명령이 된다.

 

width = 400, height = 500인 SCREEN에서 이미지의 좌표를 x = 200, y = 250으로 복사하면 이미지가 정 가운데에 나타날까?

 

정답은 아니다.

 

왜냐하면 pygame의 이미지, Rect의 좌표의 기준점은 Top, Left 이다. 따라서 x, y 좌표를 정 가운데로 정했다고 하더라고 이미지는 정가운데에서 오른쪽 아래로 보이게 될 것이다.

참고 : https://www.jbmpa.com/pygame/4


 

 

5. 모든 화면 update 하기

 

지금까지의 코딩을 통해서 이미지를 불러오고, 화면 배경색을 변경하고, 이미지를 화면의 특정 위치로 복사하였다.

하지만 이렇게 한다고 해서 화면이 원하는 것처럼 나오지 않는다.

 

pygame은 애니메이션처럼 동작한다고 생각하면 편하다.

그려놓은 이미지를 화면에 바꿔치기를 해줘야 한다. 

 

SCREEN 객체안에서 변경된 모든 코드는 update() 또는 flip() 메서드를 통해 update를 해줘야 한다.

 

SCREEN 속의 이미지가 계속 움직이려면, SCREEN.blit()을 통해 이미지를 원하는 위치에 복사하고, 변경된 결과를 pygame.display.flip()을 통해 update를 해줘야 변경된 화면이 나타나게 된다.

 

화면 업데이트 코드

pygame.display.update() 

 

# 또는

 

pygame.display.flip()

 

 

 

6. 전체 코드

 

로딩된 이미지를 출력하는 코드, 이미지 출력 코드는 게임 루프속에 작성한다.

 

import pygame

 

# 스크린 전체 크기 지정

SCREEN_WIDTH = 400
SCREEN_HEIGHT  = 500

 

# pygame 초기화

pygame.init()

 

# 스크린 객체 저장
SCREEN = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("pygame test")

 

# FPS를 위한 Clock 생성
clock = pygame.time.Clock()

 

# 이미지 로딩 및 크기 변경

player = pygame.image.load("Player.png")
player = pygame.transform.scale(player, (40, 102))

 

playing = True
while playing:

    # 이벤트 처리
    for event in pygame.event.get():

        if event.type == pygame.QUIT:
            playing = False
            pygame.quit()

 

    # 스크린 배경색 칠하기

    SCREEN.fill((255, 255, 255))

 

    # 스크린의 원하는 좌표에 이미지 복사하기

    SCREEN.blit(player, [200, 250])

 

    # 작업한 스크린의 내용을 갱신하기

    pygame.display.flip()

 

    # 1초에 60번의 빈도로 순환하기

    clock.tick(60)
 

 

 

결과

 

2921044682_1582357841.2765.png

 

 

 

##########

 

 

7. 좌표값을 Rect로 입력하기

 

모든 이미지 객체는 Rect 객체를 가질 수 있다. 로딩된 이미지를 get_rect() 메서드를 통해 Rect를 저장한다.

그리고 Rect 객체에 좌표값을 변경하여 이미지의 위치를 변경 시킬 수 있다.

 

'''

player = pygame.image.load("Player.png")

player = pygame.transform.scale(player, (40, 102))

 

player_Rect = player.get_rect()

 

print(player_Rect)

 

player_Rect.x = 200

player_Rect.y = 300

 

print(player_Rect)

...

 

결과

<rect(0, 0, 40, 102)>
<rect(200, 300, 40, 102)>

이미지를 처음 로딩한 상태에서는 x, y 좌표값이 (0,0)으로 정해지고, width와 height가 Rect에 저장되었다.

그리고 x, y 값을 추가한 다음에는 Rect안에 x, y 좌표값이 추가되며, 다른 virtual attributes도 값이 정해진다.

참고 : https://www.jbmpa.com/pygame/4

 

 

1) 이미지를 SCREEN 가운데 넣기

 

SCREEN의 blit 메서드의 좌표값에 Rect를 넣어도 된다.

SCREEN.blit(player, player_Rect )

 

만약 이미지를 SCREEN의 정가운데 넣기 위해서 x, y 좌표값을 정하려면,

SCREEN의 WIDTH, HEIGHT의 값의 중간값에서 이미지의 width, height의 중간값을 빼서 입력하는 등 약간의 계산이 필요하다.

이때, Rect의 가상 속성값을 이용하여 좌표값을 간단히 입력할 수 있다.

 

player_Rect.centerx = SCREEN_WIDTH / 2

player_Rect.centery = SCREEN_HEIGHT / 2

 

SCREEN.blit(player, player_Rect )

 

 

Rect를 이용한 전체코드

 

import pygame

 

# 스크린 전체 크기 지정

SCREEN_WIDTH = 400
SCREEN_HEIGHT  = 500

 

# pygame 초기화

pygame.init()

 

# 스크린 객체 저장
SCREEN = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("pygame test")

 

# FPS를 위한 Clock 생성
clock = pygame.time.Clock()

 

# 이미지 로딩 및 크기 변경

player = pygame.image.load("Player.png")
player = pygame.transform.scale(player, (40, 102))

 

# 이미지의 Rect 정보를 저장

player_Rect = player.get_rect()

 

# 이미지가 가운데 올 수 있도록 좌표값 수정

player_Rect.centerx = SCREEN_WIDTH / 2

player_Rect.centery = SCREEN_HEIGHT / 2

 

playing = True
while playing:

    # 이벤트 처리
    for event in pygame.event.get():

        if event.type == pygame.QUIT:
            playing = False
            pygame.quit()

 

    # 스크린 배경색 칠하기

    SCREEN.fill((255, 255, 255))

 

    # 스크린의 원하는 좌표에 이미지 복사하기, 좌표값은 Rect를 이용

    SCREEN.blit(player, player_Rect)

 

    # 작업한 스크린의 내용을 갱신하기

    pygame.display.flip()

 

    # 1초에 60번의 빈도로 순환하기

    clock.tick(60)
 

 

 

결과

 

2921044682_1582397651.6357.png

 

댓글목록 sfs

총 22 건 , 1 페이지
게시물 검색
Pygame - python GUI module 목록
번호 제목 글쓴이 조회 날짜
1 관리자 52029 02-21
열람중 관리자 43329 02-22
3 관리자 40278 02-24
4 관리자 39253 02-22
5 관리자 38193 02-22
6 관리자 36042 02-21
7 관리자 34572 02-23
8 관리자 33486 02-22
9 관리자 33438 03-10
10 관리자 32788 02-22
11 관리자 32647 02-27
12 관리자 29337 02-25
13 관리자 29053 04-05
14 관리자 28934 02-21
15 관리자 27662 03-11
16 관리자 27247 03-05
17 관리자 26597 03-11
18 관리자 25706 03-11
19 관리자 23486 03-11
20 관리자 22836 04-05
21 관리자 21442 03-10
22 관리자 20587 03-11
GNUBOARD_M
Copyright © JBMPA.com All rights reserved.