Глава 12 • Стреляющий корабль
ship.py
def update(self):
"""Обновляет позицию корабля с учетом флагов."""
# Обновляется атрибут center, не rect.
if self.moving_right and self.rect.right < self.screen_rect.right:
self.center += self.ai_settings.ship_speed_factor
if self.moving_left and self.rect.left > 0:
self.center -= self.ai_settings.ship_speed_factor
# Обновление атрибута rect на основании self.center
self.rect.centerx = self.center
Этот код проверяет позицию корабля перед изменением значения
self.center
.
Выражение
self.rect.right
возвращает координату
x
правого края прямо-
угольника корабля. Если это значение меньше значения, возвращаемого
self.
screen_rect.right
, значит, корабль еще не достиг правого края экрана
. То же
относится и к левому краю: если координата
x
левой стороны прямоугольника
больше 0, значит, корабль еще не достиг левого края экрана
. Проверка гаранти-
рует, что корабль будет оставаться в пределах экрана, перед изменением значения
self.center
.
Если вы запустите
alien_invasion .py
сейчас, то движение корабля будет останавли-
ваться у края экрана.
Рефакторинг check_events()
В ходе разработки функция
check_events()
будет становиться все длиннее, поэтому
мы выделим из
check_events()
еще две функции: для обработки событий
KEYDOWN
и для обработки событий
KEYUP
:
game_functions.py
def check_keydown_events(event, ship):
"""Реагирует на нажатие клавиш."""
if event.key == pygame.K_RIGHT:
ship.moving_right = True
elif event.key == pygame.K_LEFT:
ship.moving_left = True
def check_keyup_events(event, ship):
"""Реагирует на отпускание клавиш."""
if event.key == pygame.K_RIGHT:
ship.moving_right = False
elif event.key == pygame.K_LEFT:
ship.moving_left = False
def check_events(ship):
"""Обрабатывает нажатия клавиш и события мыши."""
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
check_keydown_events(event, ship)
В двух словах
247
elif event.type == pygame.KEYUP:
check_keyup_events(event, ship)
В программе появились две новые функции:
check_keydown_events()
и
check_
keyup_events()
. Каждая функция получает параметр
event
и параметр
ship
. Тела
двух функций скопированы из
check_events()
, а старый код заменен вызовами
новых функций. Новая структура кода упрощает функцию
check_events()
и об-
легчает последующее программирование реакции на действия игрока.
В двух словах
В следующем разделе мы реализуем стрельбу, для чего нам потребуется но-
вый файл с именем
bullet .py
и изменения в некоторых уже имеющихся файлах.
В настоящее время программа состоит из четырех файлов с разными классами,
функциями и методами. Чтобы вы четко представляли себе структуру проекта,
кратко проанализируем каждый из этих файлов перед добавлением новой функ-
циональности.
alien_invasion .py
Главный файл программы
alien_invasion .py
создает ряд важных объектов, исполь-
зуемых ходе игры: настройки хранятся в
ai_settings
, основная поверхность для
вывода изображения хранится в
screen
, а экземпляр
ship
тоже создается в этом
файле. Также в
alien_invasion .py
содержится главный цикл игры — цикл
while
с вы-
зовами
check_events()
,
ship.update()
и
update_screen()
.
Файл
alien_invasion .py
— единственный файл, который должен запускаться для игры
в Alien Invasion. Все остальные файлы —
settings .py
,
game_functions .py
,
ship .py
— со-
держат код, который импортируется (прямо или косвенно) в этот файл.
settings .py
Файл
settings .py
содержит класс
Settings
. Этот класс содержит только метод
__init__()
, инициализирующий атрибуты, которые управляют внешним видом
и скоростью игры.
game_functions .py
Файл
game_functions .py
содержит набор функций, выполняющих основную
работу в игре. Функция
check_events()
обнаруживает события, представ-
ляющие интерес для игры (например, нажатия и отпускания клавиш), и об-
рабатывает все эти типы событий при помощи вспомогательных функций
check_keydown_events()
и
check_keyup_events()
. Пока эти функции управляют
только движением корабля. Модуль
game_funct
ions
также содержит функцию
update_screen()
, которая перерисовывает экран при каждом проходе основного
цикла.
248
Достарыңызбен бөлісу: |