Добавить в корзинуПозвонить
Найти в Дзене

День 149. Обработка нажатия клавиши. Непрерывное перемещение.

Python. Обработка нажатия клавиши. Каждый раз, когда пользователь нажимает клавишу, это нажатие регистрируется в Pygame как событие. Каждое событие идентифицируется методом pygame.event.get(), поэтому в функции check_events() необходимо указать, какие события должны отслеживаться. Каждое нажатие клавиши регистрируется как событие KEYDOWN. При обнаружении события KEYDOWN необходимо проверить, была ли нажата клавиша, инициирующая некоторое игровое событие. Например, при нажатии клавиши → значение rect.centerx корабля увеличивается для перемещения корабля вправо: Функции check_events() передается параметр ship, потому что корабль должен двигаться вправо при нажатии клавиши →. Внутри check_events() в цикл событий добавляется блок elif для выполнения кода при обнаружении события KEYDOWN (8). Чтобы проверить, является ли нажатая клавиша клавишей → (pygame.K_RIGHT), мы читаем атрибут event.key (9). Если нажата клавиша →, корабль перемещается вправо, для чего значение ship.rect.centerx увеличи

Python. Обработка нажатия клавиши.

Каждый раз, когда пользователь нажимает клавишу, это нажатие регистрируется в Pygame как событие. Каждое событие идентифицируется методом pygame.event.get(), поэтому в функции check_events() необходимо указать, какие события должны отслеживаться. Каждое нажатие клавиши регистрируется как событие KEYDOWN. При обнаружении события KEYDOWN необходимо проверить, была ли нажата клавиша, инициирующая некоторое игровое событие. Например, при нажатии клавиши → значение rect.centerx корабля увеличивается для перемещения корабля вправо:

-2

Функции check_events() передается параметр ship, потому что корабль должен двигаться вправо при нажатии клавиши →. Внутри check_events() в цикл событий добавляется блок elif для выполнения кода при обнаружении события KEYDOWN (8). Чтобы проверить, является ли нажатая клавиша клавишей → (pygame.K_RIGHT), мы читаем атрибут event.key (9). Если нажата клавиша →, корабль перемещается вправо, для чего значение ship.rect.centerx увеличивается на 1. Вызов check_events() в alien_invasion.py необходимо изменить, чтобы в аргументе передавался объект ship (15):

-3

Python. Непрерывное перемещение.

Если игрок удерживает клавишу →, корабль должен двигаться вправо до тех пор, пока клавиша не будет отпущена. Чтобы узнать, когда клавиша → будет отпущена, наша игра отслеживает событие pygame.KEYUP; таким образом, реализация непрерывного движения будет основана на отслеживании событий KEYDOWN и KEYUP в сочетании с флагом moving_right.

В неподвижном состоянии корабля флаг moving_right равен False. При нажатии клавиши → флагу присваивается значение True, а когда клавиша будет отпущена, флаг возвращается в состояние False. Класс Ship управляет всеми атрибутами корабля, и мы добавим в него атрибут с именем moving_right и метод update() для проверки состояния флага moving_right. Метод update() изменяет позицию корабля, если флаг содержит значение True. Этот метод будет вызываться каждый раз, когда вы хотите обновить позицию корабля. Ниже приведены изменения в классе Ship:

-4

Мы добавляем атрибут self.moving_right в методе __init__() и инициализируем его значением False. Затем вызывается метод update(), который перемещает корабль вправо, если флаг равен True . Теперь внесем изменения в check_events(), чтобы при нажатии клавиши → moving_ right присваивалось значение True, а при ее отпускании — False:

-5

Изменяется реакция игры при нажатии клавиши →; вместо непосредственного изменения позиции корабля программа просто присваивает moving_right значение True. Добавляется новый блок elif, реагирующий на события KEYUP. Когда игрок отпускает клавишу → (K_RIGHT), moving_right присваивается значение False. Остается изменить цикл while в alien_invasion.py, чтобы при каждом проходе цикла вызывался метод update() корабля:

-6