Управление кораблем
245
def update(self):
"""Обновляет позицию корабля с учетом флагов."""
# Обновляется атрибут center, не rect.
if self.moving_right:
self.center += self.ai_settings.ship_speed_factor
if self.moving_left:
self.center -= self.ai_settings.ship_speed_factor
# Обновление атрибута rect на основании self.center.
self.rect.centerx = self.center
def blitme(self):
...
В точке в список параметров
__init__()
добавляется параметр
ai_settings
, что-
бы для корабля была доступна величина его скорости. Затем параметр
ai_settings
преобразуется в атрибут для использования в
update()
. Так как позиция корабля
изменяется с нецелым приращением пикселов, она должна храниться в перемен-
ной, способной хранить дробные значения. Формально атрибутам
rect
можно
присвоить дробные значения, но
rect
сохранит только целую часть этого значения.
Для точного хранения позиции корабля определяется новый атрибут
self.center
,
способный хранить дробные значения . Функция
float()
используется для пре-
образования значения
self.rect.centerx
в вещественный формат и сохранения
этого значения в
self.center
.
После изменения позиции корабля в
update()
значение
self.center
изменяется
на величину, хранящуюся в
ai_settings.ship_speed_factor
. После обновле-
ния
self.center
новое значение используется для обновления атрибута
self.
rect.centerx
, управляющего позицией корабля . В
self.rect.centerx
будет
сохранена только целая часть
self.center
, но для отображения корабля этого
достаточно.
Значение
ai_settings
должно передаваться в аргументе при создании экземпляра
Ship
в
alien_invasion .py
:
alien_invasion.py
...
def run_game():
...
# Создание корабля.
ship = Ship(ai_settings, screen)
...
Теперь с любым значением
ship_speed_factor
, бульшим 1, корабль будет двигаться
быстрее. Эта возможность ускорит реакцию корабля на действия игрока, а также
позволит нам изменить темп игры с течением времени.
Ограничение перемещений
Если удерживать какую-нибудь клавишу со стрелкой достаточно долго, корабль
выйдет за край экрана. Давайте сделаем так, чтобы корабль останавливался при до-
стижении края экрана. Задача решается изменением метода
update()
в классе
Ship
:
246 Глава 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
:
Достарыңызбен бөлісу: