Книга «Изучаем Python»



Pdf көрінісі
бет151/266
Дата03.03.2023
өлшемі7,86 Mb.
#170986
түріКнига
1   ...   147   148   149   150   151   152   153   154   ...   266
Байланысты:
Изучаем Python. Программирование игр, визуализация данных, веб-приложения ( PDFDrive )


Глава 12 • Стреляющий корабль
ship.py
def update(self):
"""Обновляет позицию корабля с учетом флагов."""
# Обновляется атрибут center, не rect.
 
if self.moving_right and self.rect.right < self.screen_rect.right:
self.center += self.ai_settings.ship_speed_factor
 
if self.moving_left and self.rect.left > 0:
self.center -= self.ai_settings.ship_speed_factor
# Обновление атрибута rect на основании self.center
self.rect.centerx = self.center
Этот код проверяет позицию корабля перед изменением значения 
self.center

Выражение 
self.rect.right
возвращает координату 
x
правого края прямо-
угольника корабля. Если это значение меньше значения, возвращаемого 
self.
screen_rect.right
, значит, корабль еще не достиг правого края экрана 

. То же 
относится и к левому краю: если координата 
x
левой стороны прямоугольника 
больше 0, значит, корабль еще не достиг левого края экрана 

. Проверка гаранти-
рует, что корабль будет оставаться в пределах экрана, перед изменением значения 
self.center
.
Если вы запустите 
alien_invasion .py
сейчас, то движение корабля будет останавли-
ваться у края экрана.
Рефакторинг check_events()
В ходе разработки функция 
check_events()
будет становиться все длиннее, поэтому 
мы выделим из 
check_events()
еще две функции: для обработки событий 
KEYDOWN
и для обработки событий 
KEYUP
:
game_functions.py
def check_keydown_events(event, ship):
"""Реагирует на нажатие клавиш."""
if event.key == pygame.K_RIGHT:
ship.moving_right = True
elif event.key == pygame.K_LEFT:
ship.moving_left = True
def check_keyup_events(event, ship):
"""Реагирует на отпускание клавиш."""
if event.key == pygame.K_RIGHT:
ship.moving_right = False
elif event.key == pygame.K_LEFT:
ship.moving_left = False
def check_events(ship):
"""Обрабатывает нажатия клавиш и события мыши."""
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
check_keydown_events(event, ship)


В двух словах
247
elif event.type == pygame.KEYUP:
check_keyup_events(event, ship)
В программе появились две новые функции: 
check_keydown_events()
и 
check_
keyup_events()
. Каждая функция получает параметр 
event
и параметр 
ship
. Тела 
двух функций скопированы из 
check_events()
, а старый код заменен вызовами 
новых функций. Новая структура кода упрощает функцию 
check_events()
и об-
легчает последующее программирование реакции на действия игрока.
В двух словах
В следующем разделе мы реализуем стрельбу, для чего нам потребуется но-
вый файл с именем 
bullet .py
и изменения в некоторых уже имеющихся файлах. 
В настоящее время программа состоит из четырех файлов с разными классами, 
функциями и методами. Чтобы вы четко представляли себе структуру проекта, 
кратко проанализируем каждый из этих файлов перед добавлением новой функ-
циональности.
alien_invasion .py
Главный файл программы 
alien_invasion .py
создает ряд важных объектов, исполь-
зуемых ходе игры: настройки хранятся в 
ai_settings
, основная поверхность для 
вывода изображения хранится в 
screen
, а экземпляр 
ship
тоже создается в этом 
файле. Также в 
alien_invasion .py
содержится главный цикл игры — цикл 
while
с вы-
зовами 
check_events()

ship.update()
и 
update_screen()
.
Файл 
alien_invasion .py
— единственный файл, который должен запускаться для игры 
в Alien Invasion. Все остальные файлы — 
settings .py

game_functions .py

ship .py
— со-
держат код, который импортируется (прямо или косвенно) в этот файл.
settings .py
Файл 
settings .py
содержит класс 
Settings
. Этот класс содержит только метод 
__init__()
, инициализирующий атрибуты, которые управляют внешним видом 
и скоростью игры.
game_functions .py
Файл 
game_functions .py
содержит набор функций, выполняющих основную 
работу в игре. Функция 
check_events()
обнаруживает события, представ-
ляющие интерес для игры (например, нажатия и отпускания клавиш), и об-
рабатывает все эти типы событий при помощи вспомогательных функций 
check_keydown_events()
и 
check_keyup_events()
. Пока эти функции управляют 
только движением корабля. Модуль 
game_funct
ions
также содержит функцию 
update_screen()
, которая перерисовывает экран при каждом проходе основного 
цикла.


248

Достарыңызбен бөлісу:
1   ...   147   148   149   150   151   152   153   154   ...   266




©engime.org 2024
әкімшілігінің қараңыз

    Басты бет