Управление кораблем
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
: