🎮 Все игры 🚀 Космос
1 2 3 4 5
Урок 2 · самый важный

Корабль стреляет

Что ты увидишь По пробелу корабль выпускает жёлтые лазеры, они летят вверх и исчезают за краем экрана. Можно настрелять сразу много. Файл: step2_shoot.py
⬇️ Скачать код урока

⭐ Главная идея всей игры — список объектов

Пуль на экране может быть сразу много. Заводить переменную под каждую — невозможно. Поэтому держим их в списке bullets. С ним всего три действия:

выстрел → append (добавить) кадр → двигаем все в цикле улетела → remove (убрать)

📝 Что добавилось (только про пули)

BULLET_W, BULLET_H = 4, 14
BULLET_SPEED = 9
bullets = []                       # СПИСОК пуль — пока пустой

while True:
    for event in pygame.event.get():
        # ... выход ...
        if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
            # выстрел — ДОБАВЛЯЕМ новую пулю в список
            bullets.append(pygame.Rect(ship_x - BULLET_W // 2, ship_y, BULLET_W, BULLET_H))

    # ... движение корабля ...

    # каждая пуля летит вверх; улетевшую за экран УБИРАЕМ из списка
    for b in bullets[:]:           # bullets[:] — копия, чтобы безопасно удалять
        b.y -= BULLET_SPEED
        if b.bottom < 0:
            bullets.remove(b)

    screen.fill(BG)
    for b in bullets:              # рисуем каждую пулю из списка
        pygame.draw.rect(screen, BULLET_COLOR, b)

🔍 Три важные мелочи

Почему стреляем на KEYDOWN, а не get_pressed()?

Движение мы проверяем через get_pressed() — оно «истинно» каждый кадр, пока держишь клавишу. Для выстрела так нельзя: иначе одно нажатие пробела даст десятки пуль за секунду. KEYDOWN срабатывает один раз на каждое нажатие — один пробел, одна пуля.

Что значит bullets[:]?

Это копия списка. Нельзя удалять из списка и одновременно бежать по нему — Python запутается и пропустит элементы. Поэтому идём по копии bullets[:], а удаляем из настоящего bullets. В Змейке мы список не трогали во время цикла — здесь трогаем, поэтому и копия.

Пуля — это Rect

Как и кирпичи в Арканоиде, пуля — это pygame.Rect(x, y, ширина, высота). У прямоугольника удобно двигать b.y и проверять край через b.bottom. А ещё потом он сам умеет проверять столкновения.

🎮 Попробуй сам 1. Сделай лазер быстрее: BULLET_SPEED = 14.
2. Сделай пули толще: BULLET_W = 8.
3. Стреляй из двух «пушек» сразу — добавь в список две пули со сдвигом ship_x - 12 и ship_x + 12.
← НазадУрок 1 — Корабль