728x90

벽과의 충돌 처리
이번 강의에서는 공이 화면의 벽에 부딪혔을 때 튕기도록 처리합니다.
이 과정을 통해 충돌 판정과 방향 반전의 기본 원리를 이해하는 것이 목표입니다.
이 강의가 끝나면
공은 화면 안에서 튕기며 계속 움직이게 됩니다.
벽 충돌이 필요한 이유
현재 상태에서는 공이 계속 이동하다가
화면 밖으로 사라지게 됩니다.
벽돌깨기 게임에서는
공이 화면의 좌측, 우측, 상단 벽에 부딪히면 방향을 바꿔야 합니다.
이를 위해 다음 세 가지 충돌을 처리합니다.
- 왼쪽 벽
- 오른쪽 벽
- 위쪽 벽
아래쪽 벽은 이후 라이프 처리와 함께 다룹니다.
벽 충돌의 기본 원리
벽과의 충돌 처리는 매우 단순한 구조입니다.
- x 방향 벽에 부딪히면 x 속도를 반전합니다
- y 방향 벽에 부딪히면 y 속도를 반전합니다
즉, 속도 값에 -1을 곱하는 방식으로 처리합니다.
좌우 벽 충돌 처리
공이 왼쪽이나 오른쪽 벽에 닿았는지 확인합니다.
if ball_rect.left <= 0 or ball_rect.right >= SCREEN_WIDTH:
ball_speed_x *= -1
이 코드는
공의 왼쪽이 화면 왼쪽을 넘거나,
공의 오른쪽이 화면 오른쪽을 넘었을 때
x 방향 속도를 반전시킵니다.
위쪽 벽 충돌 처리
공이 화면의 위쪽 벽에 닿았는지 확인합니다.
if ball_rect.top <= 0:
ball_speed_y *= -1
위쪽 벽에 닿으면
공은 아래 방향으로 다시 이동하게 됩니다.
충돌 처리 위치의 중요성
벽 충돌 처리는
공의 위치를 업데이트한 이후에 반드시 수행해야 합니다.
즉, 순서는 다음과 같습니다.
- 공 이동
- Rect 위치 갱신
- 벽 충돌 확인
- 속도 반전
이 순서가 바뀌면
충돌이 정상적으로 처리되지 않을 수 있습니다.
현재 단계의 결과
이번 강의까지 구현된 결과는 다음과 같습니다.
- 패들을 좌우로 이동할 수 있습니다
- 공이 자동으로 이동합니다
- 공이 벽에 부딪히면 튕깁니다
- 공이 화면 안에서 계속 움직입니다
이제 벽돌깨기 게임의 기본적인 물리 흐름이 완성되었습니다.
다음 강의에서는
공이 패들과 충돌하도록 처리합니다.

전체 코드
더보기
import pygame
import sys
pygame.init()
# 화면 설정
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("Breakout Game")
# 색상
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
# FPS 설정
clock = pygame.time.Clock()
FPS = 60
# 패들 설정
paddle_width = 100
paddle_height = 15
paddle_speed = 7
paddle_x = (SCREEN_WIDTH - paddle_width) // 2
paddle_y = SCREEN_HEIGHT - 40
paddle_rect = pygame.Rect(
paddle_x,
paddle_y,
paddle_width,
paddle_height
)
# 공 설정
ball_radius = 8
ball_x = SCREEN_WIDTH // 2
ball_y = SCREEN_HEIGHT // 2
ball_speed_x = 5
ball_speed_y = -5
ball_rect = pygame.Rect(
ball_x - ball_radius,
ball_y - ball_radius,
ball_radius * 2,
ball_radius * 2
)
# 게임 루프
running = True
while running:
clock.tick(FPS)
# 이벤트 처리
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# 패들 입력 처리
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
paddle_rect.x -= paddle_speed
if keys[pygame.K_RIGHT]:
paddle_rect.x += paddle_speed
if paddle_rect.left < 0:
paddle_rect.left = 0
if paddle_rect.right > SCREEN_WIDTH:
paddle_rect.right = SCREEN_WIDTH
# 공 이동
ball_x += ball_speed_x
ball_y += ball_speed_y
ball_rect.x = ball_x - ball_radius
ball_rect.y = ball_y - ball_radius
# 벽 충돌 처리
if ball_rect.left <= 0 or ball_rect.right >= SCREEN_WIDTH:
ball_speed_x *= -1
if ball_rect.top <= 0:
ball_speed_y *= -1
# 화면 그리기
screen.fill(BLACK)
pygame.draw.rect(screen, WHITE, paddle_rect)
pygame.draw.circle(screen, WHITE, (ball_x, ball_y), ball_radius)
pygame.display.flip()
pygame.quit()
sys.exit()
728x90
'⚙️ Python > 🎮 Pygame 실전' 카테고리의 다른 글
| [Pygame] 🧱 벽돌 깨기 게임 만들기 6강 | 벽돌(Brick) 생성 구조 (0) | 2026.02.22 |
|---|---|
| [Pygame] 🧱 벽돌 깨기 게임 만들기 5강 | 패들과 공 충돌 처리 (0) | 2026.02.22 |
| [Pygame] 🧱 벽돌 깨기 게임 만들기 3강 | 공(Ball) 기본 이동 (0) | 2026.02.20 |
| [Pygame] 🧱 벽돌 깨기 게임 만들기 2강 | 패들(Paddle) 구현 (0) | 2026.02.19 |
| [Pygame] 🧱 벽돌 깨기 게임 만들기 1강 | 게임 구조 개요 (0) | 2026.02.18 |