본문 바로가기

[Pygame] ✈️ 전투기 슈팅 게임 만들기 3강 | 스페이스바로 총알 발사하기

@도마22026. 1. 13. 19:00
728x90


1. 이번 강의 목표

이번 강의에서는 스페이스바를 눌러 총알을 발사하는 기능을 구현합니다.
총알은 플레이어 전투기에서 발사되어 위 방향으로 이동합니다.

구현할 핵심 요소는 다음과 같습니다.

  • 스페이스바 입력 처리
  • 총알 생성
  • 총알 이동
  • 화면 밖으로 나간 총알 제거

2. 총알 기본 개념

총알은 여러 개가 동시에 존재할 수 있기 때문에
리스트(List) 로 관리하는 것이 좋습니다.

총알 하나는 다음 정보를 가집니다.

  • 위치(x, y)
  • 크기(width, height)
  • 속도(speed)

3. 총알 변수 설정

먼저 총알 관련 변수를 설정합니다.

bullet_width = 5
bullet_height = 15
bullet_speed = 8

bullets = []

bullets 리스트에는 화면에 존재하는 모든 총알이 저장됩니다.


4. 스페이스바 입력으로 총알 생성

스페이스바를 누르면 총알을 생성하여 리스트에 추가합니다.

if keys[pygame.K_SPACE]:
    bullet_x = player_x + player_width // 2 - bullet_width // 2
    bullet_y = player_y
    bullets.append([bullet_x, bullet_y])

총알은 플레이어 전투기의 가운데 상단에서 발사되도록 위치를 계산합니다.

현재는 스페이스바를 누르고 있으면 연속 발사가 됩니다.
발사 제한은 이후 강의에서 처리합니다.


5. 총알 이동 처리

리스트에 들어 있는 모든 총알을 위로 이동시킵니다.

for bullet in bullets:
    bullet[1] -= bullet_speed

y 좌표를 감소시키면 총알은 위로 이동합니다.


6. 화면 밖 총알 제거

화면 밖으로 나간 총알은 메모리 관리를 위해 제거합니다.

for bullet in bullets[:]:
    if bullet[1] < 0:
        bullets.remove(bullet)

리스트 복사본(bullets[:])을 사용하는 이유는
반복 중 요소 제거로 인한 오류를 방지하기 위함입니다.


7. 총알 그리기

모든 총알을 화면에 그립니다.

for bullet in bullets:
    pygame.draw.rect(
        screen,
        (255, 255, 0),
        (bullet[0], bullet[1], bullet_width, bullet_height)
    )

8. 실행 결과

이제 게임을 실행하면 다음과 같은 동작을 확인할 수 있습니다.

  • WASD로 전투기 이동
  • 스페이스바를 누르면 총알 발사
  • 총알이 위로 이동
  • 화면 밖으로 나가면 자동 제거

9. 마무리

이번 강의에서는 다음 내용을 구현했습니다.

  • 스페이스바 입력 처리
  • 총알 생성 및 관리
  • 총알 이동과 제거

이제 게임다운 형태가 보이기 시작합니다.
다음 강의에서는 적 전투기를 화면 상단에서 생성해 보겠습니다.


전체 코드

더보기
import pygame
import sys

pygame.init()

# 화면 설정
SCREEN_WIDTH = 480
SCREEN_HEIGHT = 640
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("Shooting Game")

# FPS 설정
clock = pygame.time.Clock()
FPS = 60

# 플레이어 설정
player_width = 40
player_height = 40
player_x = SCREEN_WIDTH // 2 - player_width // 2
player_y = SCREEN_HEIGHT - player_height - 20
player_speed = 5

# 총알 설정
bullet_width = 5
bullet_height = 15
bullet_speed = 8
bullets = []

# 게임 루프
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    keys = pygame.key.get_pressed()

    # 플레이어 이동
    if keys[pygame.K_w]:
        player_y -= player_speed
    if keys[pygame.K_s]:
        player_y += player_speed
    if keys[pygame.K_a]:
        player_x -= player_speed
    if keys[pygame.K_d]:
        player_x += player_speed

    # 화면 밖 제한
    if player_x < 0:
        player_x = 0
    if player_x > SCREEN_WIDTH - player_width:
        player_x = SCREEN_WIDTH - player_width
    if player_y < 0:
        player_y = 0
    if player_y > SCREEN_HEIGHT - player_height:
        player_y = SCREEN_HEIGHT - player_height

    # 총알 발사
    if keys[pygame.K_SPACE]:
        bullet_x = player_x + player_width // 2 - bullet_width // 2
        bullet_y = player_y
        bullets.append([bullet_x, bullet_y])

    # 총알 이동
    for bullet in bullets:
        bullet[1] -= bullet_speed

    # 총알 제거
    for bullet in bullets[:]:
        if bullet[1] < 0:
            bullets.remove(bullet)

    # 화면 그리기
    screen.fill((0, 0, 0))

    pygame.draw.rect(
        screen,
        (0, 200, 255),
        (player_x, player_y, player_width, player_height)
    )

    for bullet in bullets:
        pygame.draw.rect(
            screen,
            (255, 255, 0),
            (bullet[0], bullet[1], bullet_width, bullet_height)
        )

    pygame.display.update()
    clock.tick(FPS)

pygame.quit()
sys.exit()

728x90
도마2
@도마2 :: 도마의 코드노트

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

목차