본문 바로가기

[Pygame] ✈️ 전투기 슈팅 게임 만들기 4강 | 적 전투기 생성 및 움직임 구현

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


1. 이번 강의 목표

이번 강의에서는 적 전투기를 화면 상단에서 생성하고,
아래 방향으로 이동하도록 구현합니다.

이번 강의에서 추가되는 핵심 요소는 다음과 같습니다.

  • 적 전투기 생성
  • 랜덤 위치 스폰
  • 아래 방향 이동
  • 화면 밖으로 나간 적 제거

2. 적 전투기 개념 정리

적 전투기는 총알과 마찬가지로 여러 개가 동시에 존재합니다.
따라서 총알과 동일하게 리스트(List) 로 관리합니다.

적 전투기 하나는 다음 정보를 가집니다.

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

3. 적 전투기 변수 설정

적 전투기의 기본 설정을 추가합니다.

enemy_width = 40
enemy_height = 40
enemy_speed = 3

enemies = []

4. 적 전투기 생성 (상단 랜덤 위치)

적 전투기는 화면 상단에서 랜덤한 x 위치로 생성합니다.

import random

enemy_x = random.randint(0, SCREEN_WIDTH - enemy_width)
enemy_y = -enemy_height
enemies.append([enemy_x, enemy_y])

y 좌표를 음수로 설정하면 화면 위에서 자연스럽게 내려옵니다.


5. 일정 시간마다 적 생성하기

매 프레임마다 적을 생성하면 너무 많아지므로
프레임 카운터를 사용하여 일정 간격으로 생성합니다.

enemy_spawn_delay = 60
enemy_timer = 0
enemy_timer += 1
if enemy_timer >= enemy_spawn_delay:
    enemy_timer = 0
    enemy_x = random.randint(0, SCREEN_WIDTH - enemy_width)
    enemy_y = -enemy_height
    enemies.append([enemy_x, enemy_y])

FPS가 60일 때 약 1초마다 적이 생성됩니다.


6. 적 전투기 이동 처리

모든 적 전투기를 아래 방향으로 이동시킵니다.

for enemy in enemies:
    enemy[1] += enemy_speed

7. 화면 밖 적 제거

화면 아래로 완전히 벗어난 적은 제거합니다.

for enemy in enemies[:]:
    if enemy[1] > SCREEN_HEIGHT:
        enemies.remove(enemy)

8. 적 전투기 그리기

사각형으로 적 전투기를 화면에 그립니다.

for enemy in enemies:
    pygame.draw.rect(
        screen,
        (255, 60, 60),
        (enemy[0], enemy[1], enemy_width, enemy_height)
    )

9. 마무리

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

  • 적 전투기 생성
  • 화면 상단 랜덤 스폰
  • 아래 방향 이동
  • 화면 밖 적 제거

이제 플레이어 + 총알 + 적 전투기가 모두 등장했습니다.
다음 강의에서는 드디어 총알과 적의 충돌 처리를 구현합니다.


전체 코드

더보기
import pygame
import sys
import random

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 = []

# 적 설정
enemy_width = 40
enemy_height = 40
enemy_speed = 3
enemies = []

enemy_spawn_delay = 60
enemy_timer = 0

# 게임 루프
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)

    # 적 생성
    enemy_timer += 1
    if enemy_timer >= enemy_spawn_delay:
        enemy_timer = 0
        enemy_x = random.randint(0, SCREEN_WIDTH - enemy_width)
        enemy_y = -enemy_height
        enemies.append([enemy_x, enemy_y])

    # 적 이동
    for enemy in enemies:
        enemy[1] += enemy_speed

    # 적 제거
    for enemy in enemies[:]:
        if enemy[1] > SCREEN_HEIGHT:
            enemies.remove(enemy)

    # 화면 그리기
    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)
        )

    for enemy in enemies:
        pygame.draw.rect(
            screen,
            (255, 60, 60),
            (enemy[0], enemy[1], enemy_width, enemy_height)
        )

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

pygame.quit()
sys.exit()

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

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

목차