Глава 12 • Стреляющий корабль
alien_invasion.py
...
# Запуск основного цикла игры.
while True:
gf.check_events()
gf.update_screen(ai_settings, screen, ship)
run_game()
Эти две функции упрощают цикл
while
и процесс дальнейшей разработки. Б
у
ль-
шая часть работы будет выполняться не в
run_game()
, а в модуле
game_functions
.
Так как мы решили начать работу с кодом c одного файла, мы не стали вводить мо-
дуль
game_functions
с самого начала. Эта последовательность дает представление
о реальном процессе разработки: сначала вы пишете свой код в самом простом виде,
а потом подвергаете его рефакторингу по мере роста сложности проекта.
Теперь, когда мы изменили структуру кода и упростили его расширение, можно
переходить к динамическим аспектам игры!
УПРАЖНЕНИЯ
12-1 . Синее небо: создайте окно Pygame с синим фоном .
12-2 . Игровой персонаж: найдите изображение игрового персонажа, который вам нравится,
в формате .bmp (или преобразуйте существующее изображение) . Создайте класс, который
рисует персонажа в центре экрана, и приведите цвет фона изображения в соответствие
с цветом фона экрана (или наоборот) .
Управление кораблем
Реализуем возможность перемещения корабля по горизонтали. Для этого мы на-
пишем код, реагирующий на нажатие клавиш
→
или
←
. Начнем с движения впра-
во, а потом применим те же принципы к движению влево. Заодно вы научитесь
управлять перемещением изображений на экране.
Обработка нажатия клавиши
Каждый раз, когда пользователь нажимает клавишу, это нажатие регистрируется
в Pygame как событие. Каждое событие идентифицируется методом
pygame.event.
get()
, поэтому в функции
check_events()
необходимо указать, какие события
должны отслеживаться. Каждое нажатие клавиши регистрируется как событие
KEYDOWN
.
При обнаружении события
KEYDOWN
необходимо проверить, была ли нажата кла-
виша, инициирующая некоторое игровое событие. Например, при нажатии кла-
виши
→
значение
rect.centerx
корабля увеличивается для перемещения корабля
вправо:
game_functions.py
def check_events(ship):
"""Обрабатывает нажатия клавиш и события мыши."""
Управление кораблем
241
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_RIGHT:
# Переместить корабль вправо.
ship.rect.centerx += 1
Функции
check_events()
передается параметр
ship
, потому что корабль должен
двигаться вправо при нажатии клавиши
→
. Внутри
check_events()
в цикл событий
добавляется блок
elif
для выполнения кода при обнаружении события
KEYDOWN
.
Чтобы проверить, является ли нажатая клавиша клавишей
→
(
pygame.K_RIGHT
),
мы читаем атрибут
event.key
. Если нажата клавиша
→
, корабль перемещается
вправо, для чего значение
ship.rect.centerx
увеличивается на 1
.
Вызов
check_events()
в
alien_invasion .py
необходимо изменить, чтобы в аргументе
передавался объект
ship
:
alien_invasion.py
# Запуск основного цикла игры.
while True:
gf.check_events(ship)
gf.update_screen(ai_settings, screen, ship)
Если запустить программу
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():
242
Достарыңызбен бөлісу: |