본문 바로가기
Python/pygame

02-python 게임 만들기-이미지 불러오기

by To올라운더 2024. 2. 6.
반응형

지난 포스팅에서 우리는 콘티를 생각하고,

blit 을 통해 배경 화면을 불러오는 것까지 진행하였다.

 

2024.02.05 - [Python/pygame] - 01-python 게임 만들기 - 시작(콘티)

 

01-python 게임 만들기 - 시작(콘티)

사실 게임을 만들려고 하면, 가장 먼저 시작해야하는 건 콘티라고 생각한다. 당연하게도 게임을 만들 수 있는 사람들을 모아서 게임을 만들기 때문인데, 우리는 기술(또는 기능)이 없으니, 기술

to-all-rounder.tistory.com

 

간단히 복기를 해보면,

이미지 객체를 만들고, 해당 이미지를 blit을 통해 pygame의 surface에 나타내기 위해 update까지 진행하면

우리가 원하는 이미지가 원하는 위치에 나타나게 되었다.

 

1) 캐릭터 추가하기

그럼 이제 캐릭터인 별주부와 상어를 추가해보자.

import pygame

pygame.init()

background = pygame.display.set_mode((480,360))
pygame.display.set_caption('Exciting Pygame by ToAllrounder')


# 배경 화면 나타내기
background_img = pygame.image.load(r'image/sea_backgound.png')
background.blit(background_img,(0,0))
# pygame.display.update() # 별주부 추가 후 update를 위해 생략


# 별주부 추가하기
turtle_img = pygame.image.load(r'image/rabbit_turtle.png')
background.blit(turtle_img, (240, 180))
pygame.display.update()


running = True # 동작 상태

while running:
    for event in pygame.event.get():

        if event.type == pygame.QUIT:
            running = False



pygame.quit()

 

 - 방법은 배경과 크게 다르지 않다. 

 - turtle_img 객체를 생성한 뒤, blit을 통해 turtle_img를 surface에 추가한다.

 - 그리고 마지막으로 실제 화면이 갱신되도록 pygame.display.update() 를 진행한다.

 - 이때 주의 할 사항은 surface에 blit을 먼저한 이미지가 아래로 내려간다는 것이다.

    배경을 먼저 blit하고 캐릭터를 blit하면 배경 위에 캐릭터가 나타나지만,

    반대로 캐릭터를 먼저 blit하고 배경을 blit하면 캐릭터가 배경 뒤에 숨겨져 보이지 않게된다.

 - 이미지를 추가할 때는 이미지의 좌측 상단의 위치가 기준점으로 위치가 적용되는데,

   이미지의 중앙에 캐릭터가 자리하기 위해서는 배경과 캐릭터의 크기 값이 필요하게 된다.

 

 - 이미지 크기 값은 img.get_size() 또는 img.get_rect()를 통해 구할 수 있는데,

   get_size()의 경우, 가로, 세로의 크기만 나타나고, 

   get_rect()의 경우, 해당 이미지를 직사각형으로 그렸을 때, 좌측 위쪽의 기준점인 0, 0 과

   가로, 세로 크기를 나타낸다.

 - 실제 이미지의 속성 값과 비교해보면 동일한 크기임을 확인할 수 있다.

   (이번 강의에서는 get_size()를 통해 진행하겠다.)

 

 

2) 이미지 위치 조정하기

 - 가장 먼저 기억해야 하는 건 우리가 불러온 이미지들의 기준점이 좌측 상단이라는 것이다.

import pygame

pygame.init()

SCREEN_WIDTH = 480
SCREEN_HEIGHT = 360

background = pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT))
pygame.display.set_caption('Exciting Pygame by ToAllrounder')


# 배경 화면 나타내기
background_img = pygame.image.load(r'image/sea_backgound.png')
print(f'backgound_img.get_size() 값 : {background_img.get_size()}')
print(f'backgound_img.get_rect() 값 : {background_img.get_rect()}')

background.blit(background_img,(0,0))
# pygame.display.update() # 별주부 추가 후 update를 위해 생략


# 별주부 추가하기
turtle_img = pygame.image.load(r'image/rabbit_turtle.png')
print(f'turtle_img.get_size() 값 : {turtle_img.get_size()}')
print(f'turtle_img.get_rect() 값 : {turtle_img.get_rect()}')

turtle_pos_x = SCREEN_WIDTH / 2 - turtle_img.get_size()[0] / 2
turtle_pos_y = SCREEN_HEIGHT / 2 - turtle_img.get_size()[1] / 2

background.blit(turtle_img, (turtle_pos_x, turtle_pos_y))
pygame.display.update()


running = True # 동작 상태

while running:
    for event in pygame.event.get():

        if event.type == pygame.QUIT:
            running = False



pygame.quit()

 - 먼저 pygame의 해상도를 SCREEN_WIDTH와 SCREEN_HEIGHT로 생성해준다.

   변수로 설정했기 때문에 별도로 크기 계산을 위해 get_size()나 get_rect()를 진행하지 않아도 된다.

 - 그리고 get_size()를 통해 turtle_img의 크기를 알 수 있는데, 

    1번째 값이 가로 크기, 2번째 값이 세로 크기이다.

 - 우측 그림에서와 같이 가운데에 위치하기 위해서는 

    캐릭터의 좌측 상단이 기준점임을 기억하면서,

    가로는 노란색으로 표시된 SCREEN_WIDTH의 중앙값에서 

    캐릭터의 가로 크기의 절반만큼 좌측으로 이동(빼주면) 된다.

  - 마찬가지로 세로의 위치 또한 세로의 중앙으로 표시된 노란선(SCREEN_HEIGHT/2)를 기준으로

    캐릭터의 절반 만큼 상단으로 이동(빼주면) 된다.

 

 

3) 적(상어) 추가하기

 - 상어를 추가하는 방법은 이제 어렵지 않게 적용할 수 있다.

 - shark_img를 추가한 뒤, 우측 상단에 위치시켜보겠다. 

 - 약간의 숨어있는 듯한 느낌으로 전체 이미지 중 앞부분만 보이도록 설정해보자.

import pygame

pygame.init()

SCREEN_WIDTH = 480
SCREEN_HEIGHT = 360

background = pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT))
pygame.display.set_caption('Exciting Pygame by ToAllrounder')


# 배경 화면 나타내기
background_img = pygame.image.load(r'image/sea_backgound.png')
#print(f'backgound_img.get_size() 값 : {background_img.get_size()}')
#print(f'backgound_img.get_rect() 값 : {background_img.get_rect()}')

background.blit(background_img,(0,0))
# pygame.display.update() # 별주부 추가 후 update를 위해 생략


# 별주부 추가하기
turtle_img = pygame.image.load(r'image/rabbit_turtle.png')
#print(f'turtle_img.get_size() 값 : {turtle_img.get_size()}')
#print(f'turtle_img.get_rect() 값 : {turtle_img.get_rect()}')

turtle_pos_x = SCREEN_WIDTH / 2 - turtle_img.get_size()[0] / 2
turtle_pos_y = SCREEN_HEIGHT / 2 - turtle_img.get_size()[1] / 2

background.blit(turtle_img, (turtle_pos_x, turtle_pos_y))
# pygame.display.update() # 상어 추가 후 update를 위해 생략


# 상어 추가하기
shark_img = pygame.image.load(r'image/shark.png')
shark_pos_x = SCREEN_WIDTH  - shark_img.get_size()[0] / 4
shark_pos_y = SCREEN_HEIGHT / 4 - shark_img.get_size()[1] / 2

background.blit(shark_img, (shark_pos_x, shark_pos_y))

pygame.display.update()


running = True # 동작 상태

while running:
    for event in pygame.event.get():

        if event.type == pygame.QUIT:
            running = False



pygame.quit()

 - 위의 자라를 추가하던 기능과 동일하며, 위치 값만 내가 원하는 위치에 나타나도록 값을 수정했다.

 - 오른쪽에 얼굴만 조금 보이는 상어의 모습이 개인적으로 마음에 쏙 드는 구성이다.

 

4) 크기 수정

 - 실제 게임을 할 때 자라가 상어를 피하며 조작을 해야 하는데,

    생각보다 맵이 작다는 생각이 든다.

  - SCREEN_WIDTH와 HEIGHT를 더 크게 변경하고 sea_background 이미지의 크기를 늘리는 것으로 오늘 포스팅을 마무리해보겠다.

  - 먼저 우리가 선언한 SCREEN_WIDTH와 SCREEN_HEIGHT의 값을 변경해주면,

    변수를 통해 위치를 적용한 위치 값들은 모두 정상적으로 반영되는 것을 볼 수 있다.

  - 단 하나, 배경 크기만이 제한이 되는데 불러온 background_img 를 pygame.transform.scale()를 통해 크기를 변경할 수 있다.

 

 - 전달 되는 파라미터는 원본 이미지와 튜플형태로 작성된 변경할 이미지 크기이다.

 

 

 4) 현재까지 작성 코드

import pygame

pygame.init()

SCREEN_WIDTH = 1024
SCREEN_HEIGHT = 780

background = pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT))
pygame.display.set_caption('Exciting Pygame by ToAllrounder')


# 배경 화면 나타내기
background_img = pygame.image.load(r'image/sea_backgound.png')
#print(f'backgound_img.get_size() 값 : {background_img.get_size()}')
#print(f'backgound_img.get_rect() 값 : {background_img.get_rect()}')
background_img_resize = pygame.transform.scale(background_img,(SCREEN_WIDTH, SCREEN_HEIGHT))
background.blit(background_img_resize,(0,0))
# pygame.display.update() # 별주부 추가 후 update를 위해 생략


# 별주부 추가하기
turtle_img = pygame.image.load(r'image/rabbit_turtle.png')
#print(f'turtle_img.get_size() 값 : {turtle_img.get_size()}')
#print(f'turtle_img.get_rect() 값 : {turtle_img.get_rect()}')

turtle_pos_x = SCREEN_WIDTH / 2 - turtle_img.get_size()[0] / 2
turtle_pos_y = SCREEN_HEIGHT / 2 - turtle_img.get_size()[1] / 2

background.blit(turtle_img, (turtle_pos_x, turtle_pos_y))
# pygame.display.update() # 상어 추가 후 update를 위해 생략


# 상어 추가하기
shark_img = pygame.image.load(r'image/shark.png')
shark_pos_x = SCREEN_WIDTH  - shark_img.get_size()[0] / 4
shark_pos_y = SCREEN_HEIGHT / 4 - shark_img.get_size()[1] / 2

background.blit(shark_img, (shark_pos_x, shark_pos_y))

pygame.display.update()


running = True # 동작 상태

while running:
    for event in pygame.event.get():

        if event.type == pygame.QUIT:
            running = False



pygame.quit()
반응형