Этот урок описывает добавление функционала стрельбы в игру «Космические защитники», разработанную на 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)
Теперь пули создаются при нажатии пробела, движутся вверх и удаляются после выхода за пределы экрана.
В этом уроке был добавлен функционал стрельбы, оптимизирован код и улучшено плавное перемещение пушки. Дальнейшая разработка может включать добавление врагов, столкновений и системы подсчета очков.