본문 바로가기

[Pygame] 🧱 벽돌 깨기 게임 만들기 4강 | 벽과의 충돌 처리

@도마22026. 2. 21. 19:00
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
도마2
@도마2 :: 도마의 코드노트

초보자를 위한 코딩 강의를 정리합니다. 파이썬부터 C#, Unity 게임 제작까지 차근차근 기록합니다. — 도마

목차