Pygame: Стрельба в космических защитниках (Урок 3)

Этот урок описывает добавление функционала стрельбы в игру «Космические защитники», разработанную на Python с использованием библиотеки Pygame. В предыдущем уроке было создано игровое окно, графический объект пушки и реализовано её горизонтальное перемещение. Теперь добавим стрельбу.

Оптимизация кода и плавное перемещение пушки

Для повышения читаемости и плавности движения пушки внесём два улучшения. Во-первых, вынесем обновление экрана в отдельную функцию update_screen в модуле controls:

def update_screen(bg_color, screen, gun):
  """Обновление экрана."""
  screen.fill(bg_color)
  screen.blit(gun.image, gun.rect)

В главном цикле вызываем её:

controls.update_screen(bg_color, screen, gun)

Во-вторых, для более плавного перемещения пушки будем использовать вещественные числа. Добавим атрибут center к объекту пушки:

self.center = float(self.rect.centerx)

Перемещение осуществляется с использованием self.center, а обновление self.rect происходит так:

self.rect.centerx = int(self.center)

Создание и управление пулями

Для создания пуль используем класс Sprite из Pygame. Создадим модуль bullet.py с классом Bullet, наследуемым от pygame.sprite.Sprite:

import pygame

class Bullet(pygame.sprite.Sprite):
    def __init__(self, screen, gun):
        """Создаем пулю в позиции пушки."""
        super().__init__()
        self.screen = screen
        self.rect = pygame.Rect(0, 0, 2, 12)
        self.color = (139, 195, 74)
        self.speed = 15
        self.center = float(gun.rect.centerx)
        self.rect.midbottom = gun.rect.top
        self.y = float(self.rect.y)

    def update(self):
        """Перемещение пули вверх."""
        self.y -= self.speed
        self.rect.y = int(self.y)

    def draw_bullet(self):
        """Рисуем пулю на экране."""
        pygame.draw.rect(self.screen, self.color, self.rect)

В модуле controls.py импортируем класс Bullet и создаём группу спрайтов:

from bullet import Bullet
bullets = pygame.sprite.Group()

При нажатии пробела создаётся новая пуля:

if event.type == pygame.KEYDOWN:
    if event.key == pygame.K_SPACE:
        new_bullet = Bullet(screen, gun)
        bullets.add(new_bullet)

Отрисовка и удаление пуль

В функцию update_screen добавим отрисовку пуль:

for bullet in bullets:
    bullet.update()
    bullet.draw_bullet()

Для удаления пуль, вышедших за пределы экрана, создадим функцию update_bullets:

def update_bullets(bullets):
    bullets.update()
    for bullet in bullets.copy():
        if bullet.rect.bottom <= 0:
            bullets.remove(bullet)

Вызываем её в главном цикле:

controls.update_bullets(bullets)

Теперь пули создаются при нажатии пробела, движутся вверх и удаляются после выхода за пределы экрана.

В этом уроке был добавлен функционал стрельбы, оптимизирован код и улучшено плавное перемещение пушки. Дальнейшая разработка может включать добавление врагов, столкновений и системы подсчета очков.

Что будем искать? Например,программа