티스토리 뷰

Part01. 다양한 도형 출력하기

이 단원에서는 pygame을 사용하여 게임 화면에 여러 가지 도형을 출력하는 방법을 학습한다. 지금까지는 게임이 실행될 수 있는 기본 뼈대를 만들고, init(), handle_input(), update_game(), render(), run_game()의 역할을 구분하였다. 이제 그중에서 화면을 담당하는 render() 함수 안에 실제로 보이는 요소를 추가하여 본다.

게임에서 화면에 보이는 캐릭터, 장애물, 배경, 점수판은 모두 출력 처리 과정을 통해 나타난다. 처음부터 복잡한 이미지를 다루기보다, 먼저 선, 사각형, 원과 같은 기본 도형을 그려보면 화면 출력의 원리를 쉽게 이해할 수 있다.

이번 단원에서는 먼저 선을 그리고, 이어서 사각형과 원을 출력하며, 마지막으로 이미지 파일을 화면에 출력하는 방법을 학습한다.


화면 출력 — 선

선을 그리려면 먼저 선이 어디에서 시작하고 어디에서 끝나는지를 정하여야 한다. 즉, 시작 좌표끝 좌표가 필요하다. 또한 선의 색상과 굵기도 함께 정하여야 한다. 

pygame 화면의 좌표는 일반 수학 그래프와 다르게 왼쪽 위 모서리가 (0, 0)이다. 오른쪽으로 이동할수록 x값이 커지고, 아래쪽으로 이동할수록 y값이 커진다. 따라서 화면 중앙에 도형을 그리고 싶다면 화면의 가로 길이와 세로 길이를 기준으로 좌표를 계산하여야 한다.

색상은 (R, G, B) 형식으로 표현한다. 여기서 R은 빨강, G는 초록, B는 파랑을 의미한다.

(255, 0, 0)     → 빨강
(0, 255, 0)     → 초록
(0, 0, 255)     → 파랑
(255, 255, 255) → 흰색
(0, 0, 0)       → 검은색

 


수평선 그리기 코드

예를 들어 게임 화면의 크기가 가로 600, 세로 400이라면 화면의 세로 중앙은 HEIGHT / 2, 즉 200이다. 화면 중앙에 수평선을 그리려면 시작점과 끝점의 y좌표를 모두 HEIGHT / 2로 설정하면 된다.

수평선의 핵심:
시작점 y좌표 = 끝점 y좌표
학생용 프롬프트는 다음과 같이 제시할 수 있다.
pygame 기본 뼈대 코드에서 render() 함수 안에
화면 중앙에 흰색 수평선을 그리는 코드를 추가하여줘.

pygame.draw.line() 함수를 사용하여 실제로 수평선을 그리는 코드이다. pygame.draw.line()은 pygame에서 선을 그릴 때 사용하는 함수이다. 기본 형식은 다음과 같다. 

pygame.draw.line(screen, 색상, 시작좌표, 끝좌표, 두께)

예를 들어 화면 중앙에 길이 400인 흰색 수평선을 그리고 싶다면 다음과 같이 작성할 수 있다.

start_pos = (WIDTH / 2 - 200, HEIGHT / 2)
end_pos = (WIDTH / 2 + 200, HEIGHT / 2)

pygame.draw.line(screen, (255, 255, 255), start_pos, end_pos, 3)

여기서 WIDTH / 2는 화면의 가로 중앙이고, HEIGHT / 2는 화면의 세로 중앙이다. WIDTH / 2 - 200은 중앙에서 왼쪽으로 200만큼 이동한 위치이고, WIDTH / 2 + 200은 중앙에서 오른쪽으로 200만큼 이동한 위치이다. 따라서 전체 선의 길이는 400이 된다.

중앙선을 그릴 때에는 화면 크기의 절반 좌표를 기준으로 시작점과 끝점을 계산한다.
수평선은 시작점과 끝점의 y좌표가 같아야 한다.

수평선 추가 코드 예시

import pygame
import sys

WIDTH, HEIGHT = 600, 400
FPS = 60

screen = None
clock = None
running = True


def init():
    global screen, clock

    pygame.init()
    screen = pygame.display.set_mode((WIDTH, HEIGHT))
    pygame.display.set_caption("수평선 그리기")
    clock = pygame.time.Clock()


def handle_input():
    global running

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False


def update_game():
    pass


def render():
    screen.fill((0, 0, 0))

    # 화면 중앙에 길이 400인 수평선 그리기
    start_pos = (WIDTH / 2 - 200, HEIGHT / 2)
    end_pos = (WIDTH / 2 + 200, HEIGHT / 2)

    pygame.draw.line(
        screen,
        (255, 255, 255),
        start_pos,
        end_pos,
        3
    )

    pygame.display.flip()


def run_game():
    init()

    while running:
        handle_input()
        update_game()
        render()

        clock.tick(FPS)

    pygame.quit()
    sys.exit()


run_game()

핵심 정리

구분 핵심 내용
도형 출력 위치 render() 함수
선 그리기 함수 pygame.draw.line()
수평선 조건 시작점과 끝점의 y좌표가 같음
화면 중앙 y좌표 HEIGHT / 2
화면 갱신 pygame.display.flip()
도형은 render() 함수 안에서 그린다. 수평선은 y좌표가 같은 두 점을 연결하여 그린다.

수직선 그리기

수직선은 위에서 아래로 그어지는 선이다. 수평선이 왼쪽에서 오른쪽으로 그어지는 선이었다면, 수직선은 화면의 위쪽에서 아래쪽으로 내려가는 선이다. 따라서 수직선을 그릴 때에는 시작점과 끝점의 x좌표가 같아야 한다.

예를 들어 게임 화면의 크기가 가로 600, 세로 400이라면 화면의 가로 중앙은 WIDTH // 2, 즉 300이다. 화면 중앙에 수직선을 그리려면 시작점과 끝점의 x좌표를 모두 WIDTH // 2로 설정하면 된다.

수직선의 핵심:
시작점 x좌표 = 끝점 x좌표
화면 중앙에 길이 400인 수직선을 그리려면, y좌표를 위쪽으로 200, 아래쪽으로 200 이동시켜 시작점과 끝점을 정할 수 있다.
시작점: (화면 가로 중앙, 화면 세로 중앙 - 200)
끝점: (화면 가로 중앙, 화면 세로 중앙 + 200)
즉, 수직선은 x좌표를 고정하고 y좌표만 다르게 설정하여 그린다.

프롬프트 예시

슬라이드의 문제 문구는 “화면 중앙에 수직선 그리기”로 정리하는 것이 좋다.

pygame 기본 뼈대 코드에서 render() 함수 안에
게임 화면 중앙에 길이 400인 흰색 수직선을 그리는 코드를 추가하여줘.
 

수직선 그리기 코드

def render():
    screen.fill((0, 0, 0))  # 검은색 배경

    # 화면 중앙에 길이 400인 수직선
    # 시작점: 가운데에서 위쪽으로 200
    start_pos = (WIDTH // 2, HEIGHT // 2 - 200)

    # 끝점: 가운데에서 아래쪽으로 200
    end_pos = (WIDTH // 2, HEIGHT // 2 + 200)

    # 흰색, 두께 3인 수직선 그리기
    pygame.draw.line(screen, (255, 255, 255), start_pos, end_pos, 3)

    pygame.display.flip()

전체 코드 예시

import pygame
import sys

WIDTH, HEIGHT = 600, 400
FPS = 60

screen = None
clock = None
running = True


def init():
    global screen, clock

    pygame.init()
    screen = pygame.display.set_mode((WIDTH, HEIGHT))
    pygame.display.set_caption("수직선 그리기")
    clock = pygame.time.Clock()


def handle_input():
    global running

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False


def update_game():
    pass


def render():
    screen.fill((0, 0, 0))  # 검은색 배경

    # 화면 중앙에 길이 400인 수직선
    start_pos = (WIDTH // 2, HEIGHT // 2 - 200)
    end_pos = (WIDTH // 2, HEIGHT // 2 + 200)

    pygame.draw.line(screen, (255, 255, 255), start_pos, end_pos, 3)

    pygame.display.flip()


def run_game():
    init()

    while running:
        handle_input()
        update_game()
        render()

        clock.tick(FPS)

    pygame.quit()
    sys.exit()


run_game()

수평선과 수직선 비교

구분 좌표 예시
수평선 y좌표가 같다 (100, 200) → (500, 200)
수직선 x좌표가 같다 (300, 0) → (300, 400)

 

수평선은 y좌표를 고정하고 x좌표를 바꾸어 그린다.
수직선은 x좌표를 고정하고 y좌표를 바꾸어 그린다.

대각선 그리기

대각선은 가로 방향과 세로 방향으로 동시에 이동하는 선이다. 수평선은 y좌표가 같고, 수직선은 x좌표가 같지만, 대각선은 시작점과 끝점의 x좌표와 y좌표가 모두 달라진다.

예를 들어 왼쪽 위에서 오른쪽 아래로 내려가는 대각선을 그리고 싶다면, 시작점은 화면의 왼쪽 위에 가까운 좌표로 두고, 끝점은 오른쪽 아래에 가까운 좌표로 두면 된다. pygame 화면에서는 왼쪽 위가 (0, 0)이고, 오른쪽으로 갈수록 x값이 커지며, 아래로 내려갈수록 y값이 커진다. 따라서 왼쪽 위에서 오른쪽 아래로 향하는 대각선은 다음과 같은 좌표 관계를 가진다.

시작점: (작은 x값, 작은 y값)
끝점: (큰 x값, 큰 y값)
가장 단순하게는 다음과 같이 지정할 수 있다.
시작점: (0, 0)
끝점: (WIDTH, HEIGHT)
이렇게 하면 게임 화면의 왼쪽 위 모서리에서 오른쪽 아래 모서리 방향으로 대각선이 그려진다.

프롬프트 예시

pygame 기본 뼈대 코드에서 render() 함수 안에
왼쪽 위에서 오른쪽 아래로 가로지르는 흰색 대각선을 그리는 코드를 추가하여줘.
선의 두께는 3으로 설정하여줘.
또는 화면 안쪽에 여백을 두고 그리고 싶다면 다음처럼 요청할 수 있다.
pygame 기본 뼈대 코드에서 render() 함수 안에
게임 화면의 왼쪽 위에서 오른쪽 아래로 향하는 대각선을 그려줘.
단, 화면 가장자리에서 약간 떨어지도록 시작점과 끝점에 여백을 두어줘.
 

대각선 그리기 코드

1. 화면 전체를 가로지르는 대각선

def render():
    screen.fill((0, 0, 0))  # 검은색 배경

    # 왼쪽 위에서 오른쪽 아래로 대각선 그리기
    start_pos = (0, 0)
    end_pos = (WIDTH, HEIGHT)

    pygame.draw.line(screen, (255, 255, 255), start_pos, end_pos, 3)

    pygame.display.flip()
 

2. 여백을 두고 그리는 대각선

def render():
    screen.fill((0, 0, 0))  # 검은색 배경

    # 화면 가장자리에서 50만큼 떨어진 대각선
    start_pos = (50, 50)
    end_pos = (WIDTH - 50, HEIGHT - 50)

    pygame.draw.line(screen, (255, 255, 255), start_pos, end_pos, 3)

    pygame.display.flip()
 

수평선, 수직선, 대각선 비교

구분 좌표 특징 예시
수평선 y좌표가 같다 (100, 200) → (500, 200)
수직선 x좌표가 같다 (300, 50) → (300, 350)
대각선 x좌표와 y좌표가 모두 달라진다 (50, 50) → (550, 350)

대각선은 두 점을 연결하여 그리는 선이라는 점에서는 수평선, 수직선과 동일하다. 차이는 시작점과 끝점의 좌표 변화에 있다. 수평선은 y좌표가 같고, 수직선은 x좌표가 같지만, 대각선은 x좌표와 y좌표가 모두 달라진다. 따라서 왼쪽 위에서 오른쪽 아래로 내려가는 대각선을 그리려면 시작점은 작은 x값과 작은 y값으로 설정하고, 끝점은 큰 x값과 큰 y값으로 설정한다.


사각형

사각형은 가로 길이와 세로 길이를 가진 도형이다. pygame에서 사각형을 그리려면 먼저 사각형이 화면의 어느 위치에서 시작할지 정하여야 한다. 또한 사각형의 가로 길이, 세로 길이, 선의 두께, 색상을 함께 지정하여야 한다. 사각형을 그리기 위한 문제는 다음 요소로 나누어 생각할 수 있다.

요소 의미
사각형 시작 좌표 사각형의 왼쪽 위 위치
사각형 가로 길이 사각형의 폭
사각형 세로 길이 사각형의 높이
사각형 선의 두께 테두리의 굵기
사각형 선의 색상 RGB 값으로 표현
사각형은 시작 좌표, 가로 길이, 세로 길이로 위치와 크기를 정한다.
pygame에서 사각형의 시작 좌표는 사각형의 왼쪽 위 모서리를 의미한다.

정사각형 그리기

화면 중앙에 정사각형을 그리려면 먼저 화면의 중앙 좌표를 기준으로 정사각형의 왼쪽 위 좌표를 계산하여야 한다. 예를 들어 한 변의 길이가 200인 정사각형을 화면 중앙에 배치하려면, 화면 중앙에서 왼쪽으로 100, 위쪽으로 100 이동한 지점을 시작 좌표로 잡는다. 

정사각형 시작 x좌표 = WIDTH // 2 - 100
정사각형 시작 y좌표 = HEIGHT // 2 - 100
가로 길이 = 200
세로 길이 = 200
 
프롬프트 예시는 다음과 같다.
pygame 기본 뼈대 코드에서 render() 함수 안에
화면 중앙에 한 변의 길이가 200인 흰색 정사각형을 그리는 코드를 추가하여줘.
정사각형은 내부를 채우지 말고 테두리만 보이게 하여줘.

 

정사각형 그리기 코드

pygame.Rect()는 사각형의 위치와 크기 정보를 만드는 코드이고, 실제로 화면에 사각형을 그리는 코드는 pygame.draw.rect()이다. 따라서 다음 코드만 있으면 사각형 정보만 만든 것이며, 화면에는 보이지 않는다.

rect = pygame.Rect(WIDTH // 2 - 100, HEIGHT // 2 - 100, 200, 200)
실제로 사각형을 화면에 출력하려면 다음 코드가 함께 필요하다.
pygame.draw.rect(screen, (255, 255, 255), rect, 3)
정사각형을 그리는 render() 함수 예시는 다음과 같다.
def render():
    screen.fill((0, 0, 0))  # 검은색 배경

    # 화면 중앙에 한 변의 길이가 200인 정사각형 배치
    rect = pygame.Rect(WIDTH // 2 - 100, HEIGHT // 2 - 100, 200, 200)

    # 흰색, 두께 3인 정사각형 테두리 그리기
    pygame.draw.rect(screen, (255, 255, 255), rect, 3)

    pygame.display.flip()
 

화면 출력 — 원

원은 한 점을 중심으로 일정한 거리만큼 떨어진 점들의 집합이다. 이때 중심에서 원의 가장자리까지의 거리를 반지름이라고 한다. pygame에서 원을 그리려면 원의 중심 좌표, 반지름, 선의 두께, 색상을 정하여야 한다.원을 그리기 위한 문제는 다음 요소로 나눌 수 있다.

요소 의미
원의 중심 원이 배치될 중심 좌표
원의 반지름 중심에서 원의 둘레까지의 거리
원 선의 두께 원 테두리의 굵기
원 선의 색상 RGB 값으로 표현

원을 그릴 때에는 사각형과 달리 시작 좌표가 아니라 중심 좌표를 사용한다.
따라서 원은 중심점과 반지름을 기준으로 크기와 위치가 결정된다.

화면 중앙에 원을 그리려면 중심 좌표를 화면의 중앙으로 설정하면 된다. 예를 들어 화면 크기가 600×400이라면 중심 좌표는 (300, 200)이다. 이를 일반화하면 다음과 같이 쓸 수 있다. 

원의 중심 좌표 = (WIDTH // 2, HEIGHT // 2)
프롬프트 예시는 다음과 같다.
pygame 기본 뼈대 코드에서 render() 함수 안에
화면 중앙에 반지름이 100인 흰색 원을 그리는 코드를 추가하여줘.
원은 내부를 채우지 말고 테두리만 보이게 하여줘.

원 그리기 코드

pygame에서 원을 그릴 때에는 pygame.draw.circle() 함수를 사용한다. 기본 형식은 다음과 같다.

pygame.draw.circle(screen, 색상, 중심좌표, 반지름, 두께)
화면 중앙에 반지름 100인 흰색 원을 그리는 코드는 다음과 같다.
def render():
    screen.fill((0, 0, 0))  # 검은색 배경

    # 화면 중앙에 반지름 100인 원 그리기
    pygame.draw.circle(
        screen,
        (255, 255, 255),
        (WIDTH // 2, HEIGHT // 2),
        100,
        5
    )

    pygame.display.flip()

pygame.draw.circle()에는 화면, 색상, 중심 좌표, 반지름, 두께가 들어간다.
마지막 두께 값을 생략하면 내부가 채워진 원이 그려지고, 두께 값을 지정하면 테두리만 그려진다.


실습 — 타원 그리기

타원은 원과 비슷하지만 가로 길이와 세로 길이가 서로 다른 도형이다. pygame에서 타원은 원처럼 중심과 반지름만으로 직접 그리지 않고, 먼저 타원이 들어갈 사각형 영역을 정한 뒤 그 사각형 안에 맞추어 그린다. 즉, 타원은 다음 순서로 생각할 수 있다.

타원이 들어갈 사각형 영역 정하기
→ 그 사각형 안에 타원 그리기
예를 들어 화면 중앙에 가로 400, 세로 200 크기의 타원을 그리고 싶다면, 화면 중앙을 기준으로 사각형 영역을 먼저 만든다.

프롬프트 예시는 다음과 같다.

pygame 기본 뼈대 코드에서 render() 함수 안에
화면 중앙에 가로 400, 세로 200 크기의 흰색 타원을 그리는 코드를 추가하여줘.
타원은 내부를 채우지 말고 테두리만 보이게 하여줘.

타원은 사각형 영역 안에 그려지는 도형이다.
따라서 먼저 타원이 들어갈 사각형의 위치와 크기를 정한 다음, 그 사각형 정보를 이용하여 타원을 그린다


타원 그리기 코드

pygame에서 타원을 그릴 때에는 pygame.draw.ellipse() 함수를 사용한다. 이 함수는 pygame.Rect()로 만든 사각형 영역을 기준으로 타원을 그린다. 기본 형식은 다음과 같다.

pygame.draw.ellipse(screen, 색상, 사각형영역, 두께)
화면 중앙에 가로 400, 세로 200인 흰색 타원을 그리는 코드는 다음과 같다.
def render():
    screen.fill((0, 0, 0))  # 검은색 배경

    # 타원의 가로와 세로 크기
    oval_width = 400
    oval_height = 200

    # 화면 중앙 좌표
    cx = WIDTH // 2
    cy = HEIGHT // 2

    # 타원이 들어갈 사각형 영역 만들기
    rect = pygame.Rect(
        cx - oval_width // 2,
        cy - oval_height // 2,
        oval_width,
        oval_height
    )

    # 흰색, 두께 3인 타원 그리기
    pygame.draw.ellipse(screen, (255, 255, 255), rect, 3)

    pygame.display.flip()

도형별 함수 정리

도형 함수 필요 정보
pygame.draw.line() 시작 좌표, 끝 좌표, 색상, 두께
사각형 pygame.draw.rect() 시작 좌표, 가로 길이, 세로 길이, 색상, 두께
pygame.draw.circle() 중심 좌표, 반지름, 색상, 두께
타원 pygame.draw.ellipse() 사각형 영역, 색상, 두께

도형 출력 핵심 정리

도형은 render() 함수 안에서 그린다.
사각형은 시작 좌표와 가로·세로 길이로 그리고,
원은 중심 좌표와 반지름으로 그리며,
타원은 사각형 영역 안에 맞추어 그린다.

이미지 출력

이미지 출력은 게임 화면에 미리 준비한 그림 파일을 보여주는 과정이다. 선, 사각형, 원은 pygame 코드만으로 직접 그릴 수 있지만, 캐릭터나 적, 아이템처럼 구체적인 모양은 이미지 파일을 불러와서 사용하는 경우가 많다. 이미지를 출력하기 위해서는 먼저 초기화 단계에서 이미지 파일을 불러와야 한다. 예를 들어 img1.png와 같은 PNG 파일을 준비하고, pygame.image.load()를 사용하여 코드 안으로 불러온다. 이후 이미지의 처음 위치를 정하고, 출력 처리 단계에서 화면에 이미지를 그린다. 

이때 이미지의 위치는 x좌표와 y좌표로 설정한다. pygame 화면의 원점 (0, 0)은 왼쪽 위 모서리이므로, 이미지가 어디에 나타날지 정할 때 이 좌표 체계를 이해하여야 한다.

 

이미지 출력은 도형 출력과 비슷하지만, 먼저 이미지 파일을 불러오는 과정이 필요하다.
초기화 단계에서는 이미지를 불러오고 위치를 정하며, 출력 처리 단계에서는 이미지를 화면에 그린다.

이미지 출력 — 이미지 Tip

이미지 파일은 보통 PNG 형식을 사용하는 것이 좋다. PNG 파일은 투명 배경을 지원하기 때문에 캐릭터 주변에 흰색 네모 배경이 생기지 않고 자연스럽게 출력할 수 있다. 게임 캐릭터 이미지는 너무 크지 않은 것이 좋다. 이미지가 지나치게 크면 화면을 가리거나, 처리 속도에 부담이 될 수 있다. 초보자 실습에서는 32px에서 128px 정도 크기의 이미지를 사용하는 것이 적절하다.

이미지를 찾을 때에는 다음과 같은 검색어를 사용할 수 있다.

png transparent game sprite
여기서 transparent는 투명 배경을 의미하고, sprite는 게임에서 사용하는 캐릭터나 오브젝트 이미지를 뜻한다.
게임 이미지로는 투명 배경 PNG 파일을 사용하는 것이 좋다.
파일 이름은 코드에 입력한 이름과 정확히 같아야 하며, 파이썬 파일과 같은 폴더에 두는 것이 가장 쉽다.

이미지 출력 실습

프롬프트 예시는 다음과 같다.

pygame 기본 뼈대 코드를 이용하여
게임 창 밑에서 3/4 위치에 img1.png 이미지를 출력하는 코드를 추가하여줘.
이미지는 투명 배경 PNG 파일이라고 가정하여줘.
이 실습의 핵심은 이미지가 단순히 파일로 존재하는 것만으로는 화면에 보이지 않는다는 점이다. 이미지를 화면에 보이게 하려면 반드시 다음 과정이 필요하다.
이미지 파일 불러오기
→ 이미지 위치 정하기
→ screen.blit()으로 화면에 출력하기
→ pygame.display.flip()으로 화면 갱신하기
 

이미지 출력 코드

이미지 출력 코드에서 가장 중요한 부분은 세 가지이다.

첫째, 이미지 변수를 선언한다.

img1 = None
 

둘째, 초기화 함수에서 이미지를 불러온다.

img1 = pygame.image.load("img1.png").convert_alpha()
여기서 convert_alpha()는 PNG 이미지의 투명 배경을 제대로 처리하기 위해 사용한다.

셋째, 출력 함수에서 이미지를 화면에 그린다.

img1_rect = img1.get_rect(center=(WIDTH // 2, HEIGHT * 3 // 4))
screen.blit(img1, img1_rect)
get_rect()는 이미지의 위치와 크기 정보를 담은 사각형 영역을 만든다. center=(WIDTH // 2, HEIGHT * 3 // 4)는 이미지의 중심을 화면 가로 중앙, 세로 3/4 지점에 배치하겠다는 뜻이다.

 

이미지 파일 자체는 그림 데이터이고, rect는 그 이미지가 화면 어디에 놓일지를 정하는 위치 정보이다.
screen.blit()은 이미지를 실제 화면에 붙이는 명령이다.

최소 이미지 출력 코드 예시

def render():
    screen.fill((0, 0, 0))

    img1_rect = img1.get_rect(center=(WIDTH // 2, HEIGHT * 3 // 4))
    screen.blit(img1, img1_rect)

    pygame.display.flip()

랜덤한 위치에 이미지 출력

이 화면은 이미지 출력에 랜덤 기능을 추가하는 단계이다. 기존 기능은 이미지를 불러오고 정해진 위치에 출력하는 것이었다. 여기에 추가로 적 이미지의 위치를 무작위로 정하는 기능을 넣는다. 랜덤 위치를 만들기 위해서는 Python의 random 모듈이 필요하다.

import random
적 이미지의 x좌표는 화면 안에서 무작위로 정하고, y좌표는 화면 위쪽에 고정할 수 있다.
enemy_rect = img2.get_rect(
    center=(random.randint(20, WIDTH - 50), 30)
)
여기서 random.randint(20, WIDTH - 50)은 20부터 WIDTH - 50 사이의 정수 중 하나를 무작위로 선택한다. 따라서 적 이미지는 실행할 때마다 조금씩 다른 x위치에 나타난다.
import random

enemy_rect = img2.get_rect(
    center=(random.randint(20, WIDTH - 50), 30)
)

def render():
    screen.fill((0, 0, 0))

    screen.blit(img1, player_rect)
    screen.blit(img2, enemy_rect)

    pygame.display.flip()

랜덤 위치에 새 이미지 추가

이 화면은 새로운 이미지 img2.png를 추가하고, 그 이미지의 x좌표를 랜덤하게 정하는 실습이다. 여기서 중요한 점은 새로운 이미지를 추가할 때 단순히 출력 코드만 추가하면 안 된다는 것이다. 새 이미지를 사용하려면 다음 세 가지가 필요하다.

1. 새 이미지 변수 선언
2. 새 이미지 파일 불러오기
3. 새 이미지 위치 설정 후 출력
프롬프트 예시는 다음과 같다.
pygame 기본 뼈대 코드에서 새로운 이미지 img2.png를 추가하여줘.
img2.png의 x좌표는 랜덤하게 정하고,
y좌표는 게임 창의 위쪽에 위치하도록 해줘.

랜덤 위치에 새 이미지 추가 코드 1

이 화면은 새로운 이미지와 위치 변수를 선언하고, 초기화 함수에서 이미지를 불러오는 부분을 보여준다.

먼저 random 모듈을 불러온다.

import random
그다음 이미지 변수와 위치 변수를 준비한다.
img1, img2 = None, None
player_rect = None
enemy_rect = None
초기화 함수에서는 두 이미지를 모두 불러온다.
img1 = pygame.image.load("img1.png").convert_alpha()
img2 = pygame.image.load("img2.png").convert_alpha()
이때 파일 이름이 실제 폴더에 있는 이미지 파일 이름과 정확히 같아야 한다. 파일 이름이나 확장자가 다르면 이미지 로드 오류가 발생한다.
새로운 이미지를 추가하려면 먼저 변수를 만들고, 초기화 단계에서 이미지를 불러와야 한다. 이미지 파일 이름과 코드에 적은 이름이 다르면 이미지가 출력되지 않는다.

랜덤 위치에 새 이미지 추가 코드 2

이 화면은 적 이미지의 위치를 랜덤하게 정하고 화면에 출력하는 부분을 보여준다. 적의 초기 위치는 다음과 같이 설정할 수 있다.

enemy_rect = img2.get_rect(
    center=(random.randint(20, WIDTH - 50), 30)
)
이 코드는 적 이미지의 중심 x좌표를 랜덤하게 정하고, y좌표는 30으로 설정한다. 따라서 적 이미지는 화면 위쪽에서 무작위 x위치에 나타난다.

출력 함수에서는 플레이어 이미지와 적 이미지를 모두 출력한다.

screen.blit(img1, player_rect)
screen.blit(img2, enemy_rect)
screen.blit()은 이미지를 화면에 그리는 명령이다. 이미지가 두 개이면 blit()도 두 번 사용한다.
random 함수는 적 이미지의 위치를 매번 다르게 만들 때 사용한다.
이미지를 여러 개 출력하려면 각각의 이미지와 rect를 screen.blit()으로 따로 출력하여야 한다.

두개 이미지 출력

import pygame

# 전역 변수
screen = None
clock = None
running = True

image1 = None  # ADDED
image2 = None  # ADDED

x1, y1 = 100, 100  # ADDED
x2, y2 = 300, 200  # ADDED


# 1) 게임 초기화
def init():
    global screen, clock, image1, image2
    
    pygame.init()  # ADDED
    
    screen = pygame.display.set_mode((600, 400))  # ADDED
    pygame.display.set_caption("2개 이미지 출력")  # ADDED
    
    clock = pygame.time.Clock()  # ADDED

    # 이미지 불러오기
    image1 = pygame.image.load("img1.png")  # ADDED
    image2 = pygame.image.load("img2.png")  # ADDED


# 2) 게임 입력
def handle_input():
    global running
    
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False


# 3) 게임 업데이트
def update_game():
    pass


# 4) 출력 처리
def render():
    screen.fill((0, 0, 0))  # ADDED
    
    # 첫 번째 이미지
    screen.blit(image1, (x1, y1))  # ADDED
    
    # 두 번째 이미지
    screen.blit(image2, (x2, y2))  # ADDED
    
    pygame.display.flip()  # ADDED


# 5) 실행
def run_game():
    global running
    
    init()  # ADDED
    
    while running:
        handle_input()
        update_game()
        render()
        
        clock.tick(60)  # ADDED
    
    pygame.quit()  # ADDED


# 시작
run_game()

 


이미지 출력 — 실수 Top4

  • 첫째, pygame.display.flip()을 쓰지 않는 경우이다.
    도형이나 이미지를 코드로 그렸더라도, flip()을 실행하지 않으면 화면에 반영되지 않는다.
  • 둘째, screen.fill()을 쓰지 않는 경우이다.
    화면을 지우지 않고 계속 이미지를 그리면 이전 그림이 남아 잔상처럼 보일 수 있다.
  • 셋째, 이미지 파일 경로 오류이다.
    img1.png라고 작성했는데 실제 파일 이름이 다르거나, 파이썬 파일과 다른 폴더에 있으면 이미지를 불러올 수 없다.
  • 넷째, while 반복문 밖에서 이미지를 출력하는 경우이다.
    게임 화면은 반복문 안에서 계속 다시 그려져야 하므로, 출력 코드는 보통 render() 함수 안에 있어야 한다.

이미지 출력 핵심 함수 정리

함수 역할
pygame.image.load("파일명") 이미지 파일 불러오기
convert_alpha() PNG 투명 배경 처리
get_rect() 이미지의 위치와 크기 정보 만들기
screen.blit(이미지, 위치정보) 이미지를 화면에 출력하기
pygame.display.flip() 새로 그린 화면을 실제 창에 보여주기
random.randint(a, b) a부터 b 사이의 정수 중 하나를 랜덤 선택

전체소스

import pygame
import sys

pygame.init()
screen = pygame.display.set_mode((600, 400))


# ① 이미지 불러오기
image = pygame.image.load("img1.png")  # ADDED

# ② 위치 설정
x = 0
y = 0

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    # ③ 화면 출력
    screen.fill((0, 0, 0))
    screen.blit(image, (x, y))  # ADDED

    pygame.display.flip()

pygame.quit()
sys.exit()

랜덤 이미지

import pygame
import random  # ADDED

# 전역 변수
screen = None
clock = None
running = True

image = None
x = 0
y = 0


# 1) 게임 초기화
def init():
    global screen, clock, image, x, y
    
    pygame.init()  # ADDED
    
    screen = pygame.display.set_mode((600, 400))  # ADDED
    clock = pygame.time.Clock()  # ADDED

    # 이미지 불러오기
    image = pygame.image.load("player2.png")  # ADDED
    image = pygame.transform.scale(image, (50, 50))  # ADDED (이미지 크기 조정)
    
    
    # 랜덤 위치 설정
    x = random.randint(0, 500)  # ADDED
    y = random.randint(0, 300)  # ADDED


# 2) 게임 입력
def handle_input():
    global running, x, y
    
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        
        # 키를 누르면 위치 변경
        if event.type == pygame.KEYDOWN:  # ADDED
            x = random.randint(0, 500)    # ADDED
            y = random.randint(0, 300)    # ADDED


# 3) 게임 업데이트
def update_game():
    pass


# 4) 출력 처리
def render():
    screen.fill((0, 0, 0))  # ADDED
    
    screen.blit(image, (x, y))  # ADDED
    
    pygame.display.flip()  # ADDED


# 5) 실행
def run_game():
    global running
    
    init()  # ADDED
    
    while running:
        handle_input()
        update_game()
        render()
        
        clock.tick(60)  # ADDED
    
    pygame.quit()  # ADDED


# 시작
run_game()

Summary

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/05   »
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
글 보관함