ПРИМЕЧАНИЕ
Вызов super(Bullet, self) .__init__() использует синтаксис Python 2 .7 . В Python 3 этот синтаксис тоже
работает, хотя вызов также можно записать в более простой форме super() .__init__() .
В точке
создается атрибут
rect
пули. Пуля не создается на основе готового
изображения, поэтому прямоугольник приходится строить «с нуля» при по-
мощи класса
pygame.Rect()
. При создании экземпляра этого класса необходимо
задать координаты левого верхнего угла прямоугольника, его ширину и высоту.
Прямоугольник инициализируется в точке (0, 0), но в следующих двух строках
он перемещается в нужное место, так как позиция пули зависит от позиции
корабля. Ширина и высота пули определяются значениями, хранящимися
в
ai_settings
.
В точке
атрибуту
centerx
пули присваивается значение
rect.centerx
корабля.
Пуля должна появляться
у
верхнего края корабля, поэтому верхний край пули
совмещается с верхним краем прямоугольника корабля для имитации «выстрела»
из корабля
.
Координата
y
пули хранится в вещественной форме для внесения более точных
изменений в скорость пули
. В точке
настройки цвета и скорости пули сохра-
няются в
self.color
и
self.speed_factor
.
А вот как выглядит вторая часть
bullet .py
,
update()
и
draw_bullet()
:
bullet.py
def update(self):
"""Перемещает пулю вверх по экрану."""
250
Глава 12 • Стреляющий корабль
# Обновление позиции пули в вещественном формате.
self.y -= self.speed_factor
# Обновление позиции прямоугольника.
self.rect.y = self.y
def draw_bullet(self):
"""Вывод пули на экран."""
pygame.draw.rect(self.screen, self.color, self.rect)
Метод
update()
управляет позицией пули. Когда происходит выстрел, пуля двига-
ется вверх по экрану, что соответствует уменьшению координаты
y
; следовательно,
для обновления позиции пули следует вычесть величину, хранящуюся в
self.
speed_factor
, из
self.y
. Затем значение
self.y
используется для изменения
значения
self.rect.y
. Атрибут
speed_factor
позволяет увеличить скорость пуль
по ходу игры или при изменении ее поведения. Координата
x
пули после выстрела
не изменяется, поэтому пуля летит вертикально по прямой линии.
Для вывода пули на экран вызывается функция
draw_bullet()
. Она заполняет часть
экрана, определяемую прямоугольником пули, цветом из
self.color
.
Группировка пуль
Класс
Bullet
и все необходимые настройки готовы; можно переходить к на-
писанию кода, который будет выпускать пулю каждый раз, когда игрок на-
жимает клавишу «пробел». Сначала мы создадим в
alien_invasion .py
группу для
хранения всех летящих пуль, чтобы программа могла управлять их полетом.
Эта группа будет представлена экземпляром класса
pygame.sprite.Group
, ко-
торый напоминает список с расширенной функциональностью, которая может
быть полезна при построении игр. Мы воспользуемся группой для прорисовки
пуль на экране при каждом проходе основного цикла и обновления текущей
позиции каждой пули:
alien_invasion.py
import pygame
from pygame.sprite import Group
...
def run_game():
...
# Создание корабля.
ship = Ship(ai_settings, screen)
# Создание группы для хранения пуль.
bullets = Group()
# Запуск основного цикла игры.
while True:
gf.check_events(ai_settings, screen, ship, bullets)
ship.update()
bullets.update()
gf.update_screen(ai_settings, screen, ship, bullets)
run_game()
Стрельба
251
Класс
Group
импортируется из
pygame.sprite
. В точке
создается экземпляр
Group
с именем
bullets
. Эта группа создается за пределами цикла
while
, чтобы новая
группа пуль не создавалась при каждом проходе цикла.
Достарыңызбен бөлісу: |