본문 바로가기

[Pygame] 🧱 벽돌 깨기 게임 만들기 3강 | 공(Ball) 기본 이동

@도마22026. 2. 20. 19:00
728x90


공(Ball) 기본 이동

이번 강의에서는 벽돌깨기 게임의 핵심 객체인
공(Ball) 을 생성하고 자동으로 이동시키는 기능을 구현합니다.

이 강의의 목표는 다음과 같습니다.

  • 공 객체를 화면에 생성합니다
  • x, y 속도를 이용해 공을 이동시킵니다
  • 프레임 기반 이동 구조를 이해합니다

공 객체의 역할

공은 벽돌깨기 게임에서 가장 많은 충돌을 처리하는 객체입니다.

  • 매 프레임마다 위치가 변경됩니다
  • 속도를 가지고 이동합니다
  • 이후 벽, 패들, 벽돌과 충돌하게 됩니다

이번 강의에서는
아직 충돌 처리는 하지 않고,
공이 자동으로 움직이는 기본 구조만 구현합니다.


공의 크기와 초기 위치 설정

먼저 공의 크기와 시작 위치를 변수로 정의합니다.

ball_radius = 8

ball_x = SCREEN_WIDTH // 2
ball_y = SCREEN_HEIGHT // 2

공은 화면 중앙에서 시작하도록 설정합니다.
반지름을 사용하는 이유는
원을 그릴 때 중심 좌표가 필요하기 때문입니다.


공의 속도 개념 이해하기

공은 위치 자체를 직접 바꾸지 않고
속도 값을 이용해 이동합니다.

ball_speed_x = 5
ball_speed_y = -5

이 코드 한 줄이
공이 자동으로 움직이게 만드는 핵심입니다.


공을 화면에 그리기

공은 사각형이 아니라 원(circle) 으로 그립니다.

pygame.draw.circle(
    screen,
    WHITE,
    (ball_x, ball_y),
    ball_radius
)

이때 (ball_x, ball_y) 는
원의 중심 좌표입니다.


공의 Rect 객체 생성

이후 충돌 처리를 위해
공도 Rect 객체를 함께 관리합니다.

ball_rect = pygame.Rect(
    ball_x - ball_radius,
    ball_y - ball_radius,
    ball_radius * 2,
    ball_radius * 2
)

공은 원이지만
충돌 판정은 사각형(Rect)으로 처리하는 방식이
파이게임에서 가장 일반적인 구조입니다.


공 Rect 위치 동기화하기

공의 위치가 바뀔 때마다
Rect 위치도 함께 갱신해야 합니다.

ball_rect.x = ball_x - ball_radius
ball_rect.y = ball_y - ball_radius

이 작업을 하지 않으면
화면에 보이는 공과 충돌 판정 위치가 어긋나게 됩니다.


현재 단계의 결과

이번 강의까지 구현된 결과는 다음과 같습니다.

  • 패들을 좌우로 이동할 수 있습니다
  • 화면 중앙에서 공이 생성됩니다
  • 공이 대각선 방향으로 계속 이동합니다

아직 벽에 튕기지는 않지만,
공의 이동 구조는 완전히 완성된 상태입니다.

다음 강의에서는
이 공이 화면 벽에 부딪혀 튕기도록 처리합니다.



전체 코드

더보기
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

    # 화면 그리기
    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 게임 제작까지 차근차근 기록합니다. — 도마

목차