Глава 12 • Стреляющий корабль
Если событие
KEYDOWN
происходит для события
K_LEFT
, то
moving_left
присваи-
вается
True
. Если событие
KEYUP
происходит для события
K_LEFT
, то
moving_left
присваивается
False
. Здесь возможно использовать блоки
elif
, потому что каждое
событие связано только с одной клавишей. Если же игрок нажимает обе клавиши
одновременно, то программа обнаруживает два разных события.
Если вы запустите
alien_invasion .py
, то увидите, что корабль может непрерывно
двигаться влево и вправо. Если же нажать обе клавиши, корабль останавливается.
Следующий шаг — доработка движения корабля. Внесем изменения в скорость
и ограничим величину перемещения, чтобы корабль не выходил за края экрана.
Регулировка скорости корабля
В настоящий момент корабль смещается на один пиксел за каждый проход цикла
while
, но для повышения точности управления скоростью можно добавить в класс
Settings
атрибут
ship_speed_factor
. Этот атрибут определяет величину смещения
корабля при каждом проходе цикла. Новый атрибут
settings .py
выглядит так:
settings.py
class Settings():
"""Класс для хранения всех настроек игры Alien Invasion."""
def __init__(self):
...
# Настройки корабля
Переменной
ship_speed_factor
присваивается значение 1.5. При перемещении ко-
рабля его позиция изменяется на 1,5 пиксела вместо 1. Дробные значения скорости
позволят лучше управлять скоростью корабля при последующем повышении темпа
игры. Однако атрибуты прямоугольников (такие, как
centerx
) принимают только
целочисленные значения, поэтому в
Ship
необходимо внести ряд изменений:
ship.py
class Ship():
def __init__(self, ai_settings, screen):
"""Инициализирует корабль и задает его начальную позицию."""
self.screen = screen
self.ai_settings = ai_settings
...
# Каждый новый корабль появляется у нижнего края экрана
...
# Сохранение вещественной координаты центра корабля.
self.center = float(self.rect.centerx)
# Флаги перемещения
self.moving_right = False
self.moving_left = False
Управление кораблем
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
Достарыңызбен бөлісу: |