# Запуск основного цикла игры.
Управление кораблем
243
вет на действия пользователя и будет использоваться при перерисовке корабля
на экране.
Если запустить
alien_invasion .py
и удерживать клавишу
→, корабль непрерывно
двигается вправо, пока клавиша не будет отпущена.
Перемещение влево и вправо
Теперь, когда мы реализовали непрерывное движение вправо, добавить движе-
ние влево относительно несложно. Для этого нужно снова изменить класс
Ship
и функцию
check_events()
. Ниже приведены необходимые изменения в
__init__()
и
update()
в классе
Ship
:
ship.py
def __init__(self, screen):
...
#
Флаги перемещения
self.moving_right = False
self.moving_left = False
def update(self):
"""Обновляет позицию корабля с учетом флагов."""
if self.moving_right:
self.rect.centerx += 1
if self.moving_left:
self.rect.centerx -= 1
В методе
__init__()
добавляется флаг
self.moving_left
. В
update()
используются
два отдельных блока
if
вместо
elif
, чтобы при нажатии обеих клавиш со стрелками
атрибут
rect.centerx
сначала увеличивался, а потом уменьшался. В результате
корабль остается на месте. Если бы для движения влево использовался блок
elif
,
то клавиша
→ всегда имела бы приоритет. Такая реализация повышает точность
перемещения при переключении направления, когда игрок может ненадолго удер-
живать нажатыми обе клавиши.
В
check_events()
необходимо внести два изменения:
game_functions.py
def check_events(ship):
"""Обрабатывает нажатия клавиш и события мыши."""
for event in pygame.event.get():
...
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_RIGHT:
ship.moving_right = True
elif event.key == pygame.K_LEFT:
ship.moving_left = True
elif event.type == pygame.KEYUP:
if event.key == pygame.K_RIGHT:
ship.moving_right = False
elif event.key == pygame.K_LEFT:
ship.moving_left = False
244 Глава 12 • Стреляющий
корабль
Если событие
KEYDOWN
происходит для события
K_LEFT
, то
moving_left
присваи-
вается
True
. Если событие
KEYUP
происходит для события
K_LEFT
, то
moving_left
присваивается
False
. Здесь возможно использовать блоки
elif
, потому что каждое
событие связано только с одной клавишей. Если же игрок нажимает обе клавиши
одновременно, то программа обнаруживает два разных события.
Если вы запустите
alien_invasion .py
, то увидите, что корабль может непрерывно
двигаться влево и вправо. Если же нажать обе клавиши, корабль останавливается.
Следующий шаг — доработка движения корабля. Внесем изменения в скорость
и ограничим величину перемещения, чтобы корабль не выходил за края экрана.
Регулировка скорости корабля
В настоящий момент корабль смещается на один пиксел за каждый проход цикла
while
, но для повышения точности управления скоростью можно добавить в класс
Settings
атрибут
ship_speed_factor
. Этот атрибут определяет величину смещения
корабля при каждом проходе цикла. Новый атрибут
settings .py
выглядит так:
Достарыңызбен бөлісу: