파이썬 게임 개발 강좌, 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 실전 시리즈입니다. 초보자도 쉽게 따라올 수 있도록 단계별로 구성되어 있습니다.