Создадим класс Projectile для представления снарядов. Каждый объект этого класса будет отдельным снарядом, выпускаемым игроком. Класс будет содержать методы для создания и отрисовки снарядов.
Класс снарядов
Класс Projectile:
class Projectile:
def __init__(self, x, y, radius, color, facing):
self.x = x
self.y = y
self.radius = radius
self.color = color
self.facing = facing # Направление движения (1 - вправо, -1 - влево)
self.vel = 8 * facing # Скорость снаряда
def draw(self, win):
pygame.draw.circle(win, self.color, (self.x, self.y), self.radius)
Конструктор принимает координаты x и y, радиус, цвет и направление движения (facing). Переменная vel — скорость, равная 8, умноженной на facing (определяет направление: влево или вправо). Метод draw отрисовывает снаряд как круг с помощью pygame.draw.circle.
Управление снарядами
Список projectiles хранит объекты-снаряды. В основном цикле игры мы обновляем положение каждого снаряда и удаляем те, что вышли за пределы экрана.
projectiles = []
# ... в основном цикле игры ...
for index, projectile in enumerate(projectiles):
if 0 < projectile.x < 500: # Проверка на выход за границы экрана
projectile.x += projectile.vel
else:
projectiles.pop(index)
# ... отрисовка снарядов ...
for projectile in projectiles:
projectile.draw(win)
Цикл перебирает projectiles. Если координата x снаряда в пределах экрана (0-500), его положение обновляется. Иначе снаряд удаляется с помощью projectiles.pop(index).
Создание и выстрел
Добавим логику создания снарядов по нажатию клавиши F, ограничивая их количество до 5.
# ... в основном цикле игры ...
if keys[pygame.K_f] and len(projectiles) < 5:
if last_move == "right":
facing = 1
else:
facing = -1
projectiles.append(Projectile(round(playerman.x + playerman.width//2), round(playerman.y + playerman.height//2), 5, (255, 0, 0), facing)) # добавление нового снаряда
# переменная для отслеживания последнего движения игрока
last_move = "right" # инициализация
# ...обновление last_move в зависимости от движения игрока...
Если нажата F и количество снарядов меньше 5, создаётся новый. Координаты x и y — центр игрока, радиус — 5, цвет — красный, направление определяется last_move (последнее движение игрока).
Отрисовка
Отрисовка снарядов выполняется методом draw класса Projectile и вызывается в основном цикле для каждого элемента projectiles.
В этом уроке мы создали, перемещали и отрисовывали снаряды, используя класс Projectile и отслеживая последнее движение игрока для определения направления выстрела. Ограничение на количество снарядов предотвращает перегрузку игры.