파이썬으로 만드는 나만의 게임 개발 강좌 4강 – 캐릭터와 장애물 충돌 처리하기

파이썬 게임 개발 강좌, 4강에 오신 걸 환영합니다!

이번 강의에서는 게임 제작에 있어 꼭 필요한 기능 중 하나인 **충돌 감지(Collision Detection)** 를 다루어보겠습니다.

게임 속에서 캐릭터가 장애물에 부딪혔을 때 어떤 반응을 해야 하는지는 게임의 몰입감과 완성도를 결정짓는 핵심입니다.

이번 강의 목표

  • 충돌 감지가 필요한 이유 이해하기
  • Pygame에서 충돌을 처리하는 기본 방법 익히기
  • 캐릭터가 장애물에 닿으면 게임 종료 또는 멈춤 구현하기

1. Pygame에서의 충돌 감지 방식

Pygame에서는 이미지의 위치와 크기를 rect 객체로 가져와서, colliderect() 함수를 통해 두 이미지가 겹치는지를 쉽게 판단할 수 있습니다.

이 방식은 빠르고 효율적이며, 많은 2D 게임에서 사용되는 기본 충돌 감지 기법입니다.


2. 장애물 이미지 추가

게임 폴더에 다음 이미지를 추가해주세요.

  • enemy.png (장애물용 이미지)

사이즈는 너무 크지 않게, 100×100 정도가 적당합니다.


3. 전체 코드 예시

import pygame

pygame.init()

screen_width = 800
screen_height = 600
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption("충돌 처리 예제")

background = pygame.image.load("background.png")
character = pygame.image.load("character.png")
character_size = character.get_rect().size
character_width = character_size[0]
character_height = character_size[1]
character_x_pos = (screen_width - character_width) / 2
character_y_pos = screen_height - character_height

# 이동 좌표 및 속도
to_x = 0
to_y = 0
speed = 0.6

# 장애물 설정
enemy = pygame.image.load("enemy.png")
enemy_size = enemy.get_rect().size
enemy_width = enemy_size[0]
enemy_height = enemy_size[1]
enemy_x_pos = (screen_width - enemy_width) / 2
enemy_y_pos = (screen_height / 2) - enemy_height / 2

clock = pygame.time.Clock()
running = True

while running:
    dt = clock.tick(60)

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

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                to_x -= speed
            elif event.key == pygame.K_RIGHT:
                to_x += speed
            elif event.key == pygame.K_UP:
                to_y -= speed
            elif event.key == pygame.K_DOWN:
                to_y += speed

        if event.type == pygame.KEYUP:
            if event.key in [pygame.K_LEFT, pygame.K_RIGHT]:
                to_x = 0
            if event.key in [pygame.K_UP, pygame.K_DOWN]:
                to_y = 0

    character_x_pos += to_x * dt
    character_y_pos += to_y * dt

    # 경계 설정
    if character_x_pos < 0:
        character_x_pos = 0
    elif character_x_pos > screen_width - character_width:
        character_x_pos = screen_width - character_width

    if character_y_pos < 0:
        character_y_pos = 0
    elif character_y_pos > screen_height - character_height:
        character_y_pos = screen_height - character_height

    # 충돌 체크를 위한 rect 객체 만들기
    character_rect = character.get_rect()
    character_rect.left = character_x_pos
    character_rect.top = character_y_pos

    enemy_rect = enemy.get_rect()
    enemy_rect.left = enemy_x_pos
    enemy_rect.top = enemy_y_pos

    # 충돌 체크
    if character_rect.colliderect(enemy_rect):
        print("충돌 발생! 게임 종료")
        running = False

    screen.blit(background, (0, 0))
    screen.blit(character, (character_x_pos, character_y_pos))
    screen.blit(enemy, (enemy_x_pos, enemy_y_pos))
    pygame.display.update()

pygame.quit()

4. 충돌 감지 핵심 포인트

  • 모든 이미지는 get_rect()로 사각형 객체를 만들 수 있다
  • colliderect()는 두 rect가 겹치는지를 판단하는 함수
  • 충돌 시 게임 종료 또는 별도 반응(효과음, 점수 처리 등) 가능

5. 연습 아이디어

  • 적(enemy)를 랜덤한 위치에 배치해 보기
  • 충돌 시 메시지 박스나 화면 멈춤 처리 구현
  • 여러 개의 장애물을 만들고 충돌 조건 다르게 하기

6. 다음 강의 예고

5강: 게임 시간 제한 및 종료 메시지 만들기
다음 강의에서는 제한된 시간 안에 미션을 완수해야 하는 구조로 바꿔보며, 게임에 긴장감과 목표를 부여하는 기능을 추가해볼 거예요. 게임이 끝났을 때 “Game Over” 텍스트를 출력하는 방법도 함께 다룹니다!

이 강의는 파이썬으로 2D 게임을 완성하는 Pygame 실전 시리즈입니다. 초보자도 쉽게 따라올 수 있도록 단계별로 구성되어 있습니다.