티스토리 뷰

0. 기본이미지 출력하기 

기본 골격에서 이미지를 출력 해 보자. (ex04_basic_img.py)

import pygame
import sys


# 전역 변수
WIDTH, HEIGHT = 800, 600
FPS = 60  # ADDED

screen = None
clock = None
running = True

# 색상
BLACK = (0, 0, 0)

# 이미지
img1 = None  # ADDED
player_rect = None  # ADDED


# 1. 게임 초기화
def init():
    global screen, clock, img1, player_rect

    pygame.init()
    screen = pygame.display.set_mode((WIDTH, HEIGHT))
    pygame.display.set_caption("기본 게임 뼈대 - 이미지")
    clock = pygame.time.Clock()

    # ADDED 이미지 로드
    try:
        img1 = pygame.image.load("asset/img1.png").convert_alpha()
    except pygame.error as e:
        print("이미지 로드 실패:", e)
        pygame.quit()
        sys.exit()

    # ADDED 플레이어 초기 위치 설정
    player_rect = img1.get_rect(center=(WIDTH // 2, HEIGHT * 3 // 4))


# 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(BLACK)

    # ADDED 플레이어 이미지 출력
    screen.blit(img1, player_rect)

    pygame.display.flip()


# 5. 게임 실행
def run_game():
    init()

    while running:
        handle_input()
        update_game()
        render()
        clock.tick(FPS)

    pygame.quit()
    sys.exit()


run_game()

다음 단계에서는 update_game()에 코드를 추가하여 이미지가 자동으로 아래로 이동하도록 만들면 된다.


04.이미지 자동 이동

이번 예제는 단순히 적 이미지를 아래로 움직이는 것이 목적이 아니다.
다음 장의 벽돌깨기 게임을 만들기 위해 이미지를 불러오고, 위치를 바꾸고, 다시 출력하는 기본 원리를 익히는 단계이다.

프롬프트

위 기본 이미지 출력 코드에 이어서, 두 번째 이미지가 화면 위에서 아래로 자동 이동하도록 수정해줘.

요구사항:
1. 기존 5개 함수 구조(init, handle_input, update_game, render, run_game)는 유지해줘.
2. img1은 플레이어 이미지로 화면 아래쪽 중앙에 고정해서 출력해줘.
3. img2는 적 이미지로 화면 위쪽에서 아래로 자동 이동하게 해줘.
4. 적 이미지가 화면 아래로 완전히 나가면, 다시 화면 위쪽의 랜덤한 x 위치에서 나타나게 해줘.
5. 적의 이동 속도는 enemy_speed 변수로 설정해줘.
6. 적이 다시 생성될 때마다 enemy_speed도 랜덤하게 바뀌도록 해줘.
7. random 모듈을 사용해줘.
8. 추가하거나 수정한 코드는 # ADDED 주석을 붙여줘.
9. 초보자가 이해하기 쉽도록 주석을 달아줘.

전체코드(ex04_autoImage.py)

import pygame
import sys
import random  # ADDED 랜덤 위치와 속도를 위해 사용


# 전역 변수
WIDTH, HEIGHT = 800, 600
FPS = 60  # ADDED

screen = None
clock = None
running = True

# 색상
BLACK = (0, 0, 0)

# 이미지
img1 = None
img2 = None  # ADDED
player_rect = None
enemy_rect = None  # ADDED

# 적 이동 속도
enemy_speed = 3  # ADDED


# 1. 게임 초기화
def init():
    global screen, clock
    global img1, img2, player_rect, enemy_rect, enemy_speed  # ADDED

    pygame.init()
    screen = pygame.display.set_mode((WIDTH, HEIGHT))
    pygame.display.set_caption("이미지 자동 이동")
    clock = pygame.time.Clock()

    # ADDED 이미지 로드
    try:
        img1 = pygame.image.load("asset/img1.png").convert_alpha()
        img2 = pygame.image.load("asset/img2.png").convert_alpha()
    except pygame.error as e:
        print("이미지 로드 실패:", e)
        pygame.quit()
        sys.exit()

    # ADDED 플레이어 초기 위치: 화면 아래쪽 중앙
    player_rect = img1.get_rect(center=(WIDTH // 2, HEIGHT * 3 // 4))

    # ADDED 적 초기 위치: 화면 위쪽 랜덤 위치
    enemy_x = random.randint(20, WIDTH - 20)
    enemy_rect = img2.get_rect(center=(enemy_x, 30))

    # ADDED 적 이동 속도 랜덤 설정
    enemy_speed = random.randint(2, 7)


# 2. 입력 처리
def handle_input():
    global running

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


# 3. 게임 업데이트
def update_game():
    global enemy_rect, enemy_speed

    # ADDED 적 이미지가 아래로 자동 이동
    enemy_rect.y += enemy_speed

    # ADDED 적이 화면 아래로 완전히 나가면 다시 위에서 생성
    if enemy_rect.top > HEIGHT:
        enemy_x = random.randint(20, WIDTH - 20)
        enemy_y = random.randint(-150, -50)

        enemy_rect.center = (enemy_x, enemy_y)

        # ADDED 다시 생성될 때마다 속도 변경
        enemy_speed = random.randint(2, 7)


# 4. 출력 처리
def render():
    screen.fill(BLACK)

    # ADDED 플레이어 이미지 출력
    screen.blit(img1, player_rect)

    # ADDED 적 이미지 출력
    screen.blit(img2, enemy_rect)

    pygame.display.flip()


# 5. 게임 실행
def run_game():
    init()

    while running:
        handle_input()
        update_game()
        render()
        clock.tick(FPS)

    pygame.quit()
    sys.exit()


run_game()

이미지 자동 이동 코드 단계별 설명

이번 코드는 두 개의 이미지를 사용하는 게임 구조이다.

  • img1은 플레이어 이미지로 화면 아래쪽 중앙에 고정된다.
  • img2는 적 이미지로 화면 위에서 아래로 자동 이동한다.
  • 적 이미지가 화면 아래로 사라지면 다시 화면 위쪽의 랜덤한 위치에서 나타난다.
1. init()에서 이미지를 불러온다.
2. img1은 화면 아래쪽 중앙에 배치한다.
3. img2는 화면 위쪽 랜덤 위치에 배치한다.
4. update_game()에서 img2의 y좌표를 계속 증가시킨다.
5. img2가 화면 아래로 나가면 다시 위쪽 랜덤 위치에 배치한다.
6. render()에서 img1과 img2를 화면에 출력한다.

1. 라이브러리 불러오기

import pygame
import sys
import random  # ADDED 랜덤 위치와 속도를 위해 사용
  • random은 적 이미지가 다시 나타날 때 x 위치와 속도를 무작위로 정하기 위해 사용한다.

2. 전역 변수 설정

- 이전 변수를 설명을 생략한다.

img1 = None
img2 = None  # ADDED
player_rect = None
enemy_rect = None  # ADDED
img1 플레이어 이미지
img2 적 이미지
player_rect 플레이어 이미지의 위치 정보
enemy_rect 적 이미지의 위치 정보

적 이동 속도 변수 추가

enemy_speed = 3  # ADDED
  • enemy_speed는 적 이미지가 한 번에 얼마나 아래로 이동할지를 정하는 값이다.
  • 값이 크면 적이 빠르게 내려오고, 값이 작으면 천천히 내려온다.

3. 초기화

img1 = pygame.image.load("asset/img1.png").convert_alpha()
img2 = pygame.image.load("asset/img2.png").convert_alpha()

img1은 플레이어 이미지이고, img2는 적 이미지이다.

enemy_x = random.randint(20, WIDTH - 20)
enemy_rect = img2.get_rect(center=(enemy_x, 30))
 
  • 적 이미지는 화면 위쪽의 랜덤한 x 위치에서 시작한다.
enemy_speed = random.randint(2, 7)
  • 적의 이동 속도도 2부터 7 사이에서 랜덤하게 정한다.

4. 입력

def handle_input():
 

입력 단계에서는 현재 창 닫기 이벤트만 처리한다.

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

5. 업데이트 

def update_game():

적 이미지의 위치를 계속 바꾸어 자동 이동을 만든다.

enemy_rect.y += enemy_speed
  • 적 이미지의 y좌표를 증가시킨다.
  • pygame 화면에서는 아래쪽으로 갈수록 y값이 커지므로, 이 코드는 적을 아래로 이동시킨다.
y값 증가 → 아래로 이동
  • 적이 화면 아래로 완전히 나가면 다시 위쪽에서 생성한다.
 
if enemy_rect.top > HEIGHT:
  • enemy_rect.top이 화면 높이보다 크다는 것은 적 이미지 전체가 화면 아래로 사라졌다는 뜻이다.
enemy_x = random.randint(20, WIDTH - 20)
enemy_y = random.randint(-150, -50)
enemy_rect.center = (enemy_x, enemy_y)
  • 적을 화면 위쪽 바깥의 랜덤한 위치에 다시 배치한다.
  • enemy_y를 음수로 설정하는 이유는 적이 화면 위쪽 바깥에서 자연스럽게 내려오게 하기 위함이다.
enemy_speed = random.randint(2, 7)
  • 다시 등장할 때 적의 속도도 새롭게 정한다.

6. 출력

def render():
screen.fill(BLACK)
  • 화면 전체를 검은색으로 지운다.
screen.blit(img1, player_rect)
  • 플레이어 이미지를 출력한다.
screen.blit(img2, enemy_rect)
  • 적 이미지를 현재 위치에 출력한다.
pygame.display.flip()
  • 지금까지 그린 내용을 실제 화면에 보여준다.

핵심 정리

이 코드는 img1 플레이어 이미지는 화면 아래쪽 중앙에 고정하고, img2 적 이미지는 화면 위쪽에서 아래로 자동 이동하게 만드는 예제이다.핵심 코드는 다음이다.

enemy_rect.y += enemy_speed
이 한 줄이 update_game()에서 반복 실행되기 때문에 적 이미지가 자동으로 아래로 이동한다.

 

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