252
Глава 12 • Инопланетное вторжение
Внутри
_check_events()
в цикл событий добавляется блок
elif
для выполнения
кода при обнаружении события
KEYDOWN
. Чтобы проверить, является ли нажатая
клавиша клавишей
→
(
pygame.K_RIGHT
), мы читаем атрибут
event.key
. Если
нажата клавиша
→
, корабль перемещается вправо, для чего значение
self.ship.
rect.x
увеличивается на 1
.
Если запустить программу
alien_invasion .py
сейчас, вы увидите, что корабль переме-
щается вправо на 1 пиксел при каждом нажатии клавиши
→
. Неплохо для начала,
но это не лучший способ управления кораблем. Чтобы управление было более
удобным, следует реализовать возможность непрерывного перемещения.
Непрерывное
перемещение
Если игрок удерживает клавишу
→
, корабль должен двигаться вправо до тех пор,
пока клавиша не будет отпущена. Чтобы узнать, когда клавиша
→
будет отпущена,
наша игра отслеживает событие
pygame.KEYUP
; таким образом, реализация непре-
рывного движения будет основана на отслеживании событий
KEYDOWN
и
KEYUP
в со-
четании с флагом
moving_right
.
В неподвижном состоянии корабля флаг
moving_right
равен
False
. При нажатии
клавиши
→
флагу присваивается значение
True
, а когда клавиша будет отпущена,
флаг
возвращается в состояние
False
.
Класс
Ship
управляет всеми атрибутами корабля, и мы добавим в него атрибут
с именем
moving_right
и метод
update()
для проверки состояния флага
moving_
right
. Метод
update()
изменяет позицию корабля, если флаг содержит значение
True
. Этот метод будет вызываться каждый раз, когда вы хотите обновить позицию
корабля.
Ниже приведены
изменения в классе
Ship
:
ship.py
class Ship():
""" Класс для управления кораблем"""
def __init__(self, ai_game):
...
# Каждый новый корабль появляется у нижнего края экрана.
self.rect.midbottom = self.screen_rect.midbottom
#
Флаг перемещения
❶
self.moving_right = False
❷
def update(self):
"""Обновляет позицию корабля с учетом флага."""
if self.moving_right:
self.rect.x += 1
def blitme(self):
...
Управление кораблем
253
Мы добавляем атрибут
self.moving_right
в метод
__init__()
и инициализируем
его значением
False
. Затем вызывается метод
update()
, который перемещает
корабль вправо, если флаг равен
True
. Метод
update()
будет вызываться через
экземпляр
Ship
, поэтому он не считается вспомогательным методом.
Теперь внесем изменения в
run_game()
, чтобы при нажатии клавиши
→
moving_
right
присваивалось значение
True
, а при ее отпускании —
False
:
Достарыңызбен бөлісу: