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
'⚙️ Python > 🎮 Pygame 실전' 카테고리의 다른 글
| [Pygame] 🧱 벽돌 깨기 게임 만들기 5강 | 패들과 공 충돌 처리 (0) | 2026.02.22 |
|---|---|
| [Pygame] 🧱 벽돌 깨기 게임 만들기 4강 | 벽과의 충돌 처리 (0) | 2026.02.21 |
| [Pygame] 🧱 벽돌 깨기 게임 만들기 2강 | 패들(Paddle) 구현 (0) | 2026.02.19 |
| [Pygame] 🧱 벽돌 깨기 게임 만들기 1강 | 게임 구조 개요 (0) | 2026.02.18 |
| [Pygame] 🏰 2D 타워 디펜스 게임 만들기 17강 | 스프라이트 적용 (0) | 2026.02.17 |