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



Pdf көрінісі
бет164/266
Дата03.03.2023
өлшемі7,86 Mb.
#170986
түріКнига
1   ...   160   161   162   163   164   165   166   167   ...   266
Байланысты:
Изучаем Python. Программирование игр, визуализация данных, веб-приложения ( PDFDrive )


Глава 13 • Осторожно, пришельцы!
Мы используем метод 
update()
для группы 
aliens
, что приводит к автоматиче-
скому вызову метода 
update()
каждого пришельца. Если запустить Alien Invasion 
сейчас, вы увидите, как флот двигается вправо и исчезает за краем экрана.
Создание настроек для направления флота
Теперь мы создадим настройки, которые перемещают флот вниз по экрану, а потом 
влево при достижении правого края экрана. Вот как реализуется это поведение:
settings.py
# Настройки пришельцев
self.alien_speed_factor = 1
self.fleet_drop_speed = 10
# fleet_direction = 1 обозначает движение вправо; а -1 - влево.
self.fleet_direction = 1
Настройка 
fleet_drop_speed
управляет величиной снижения флота при дости-
жении им края. Эту скорость полезно отделить от горизонтальной скорости при-
шельцев, чтобы эти две скорости можно было изменять независимо.
Для настройки 
fleet_direction
можно использовать текстовое значение (напри-
мер, 
'left'
или 
'right'
), но, скорее всего, в итоге придется использовать набор 
команд 
if
-
elif
для проверки направления. Так как в данном случае направлений 
всего два, мы используем значения 1 и –1 и будем переключаться между ними при 
каждом изменении направления флота. (Числа в данном случае особенно удобны, 
потому что при движении вправо координата 
x
каждого пришельца должна увели-
чиваться, а при перемещении влево — уменьшаться.)
Проверка достижения края
Также нам понадобится метод для проверки того, достиг ли пришелец одного 
из двух краев. Для этого необходимо внести в метод 
update()
изменение, позволя-
ющее каждому пришельцу двигаться в соответствующем направлении:
alien.py
def check_edges(self):
"""Возвращает True, если пришелец находится у края экрана."""
screen_rect = self.screen.get_rect()
 
if self.rect.right >= screen_rect.right:
return True
 
elif self.rect.left <= 0:
return True
def update(self):
"""Перемещает пришельца влево или вправо."""
 
self.x += (self.ai_settings.alien_speed_factor *
self.ai_settings.fleet_direction)
self.rect.x = self.x


Перемещение флота
269
Вызов нового метода 
check_edges()
для любого пришельца позволяет проверить, 
достиг ли он левого или правого края. У пришельца, находящегося у правого края, 
атрибут 
right
его атрибута 
rect
больше или равен атрибуту 
right
атрибута 
rect
экрана 

. У пришельца, находящегося у левого края, значение 
left
меньше либо 
равно 0 

.
В метод 
update()
будут внесены изменения, обеспечивающие перемещение вле-
во и вправо 

; для этого скорость пришельца умножается на значение 
fleet_
direction
. Если значение 
fleet_direction
равно 1, то значение 
alien_speed_factor
прибавляется к текущей позиции пришельца; если же значение 
fleet_direction
равно –1, то значение вычитается из позиции пришельца (который перемещается 
влево).
Снижение флота и смена направления
Когда пришелец доходит до края, весь флот должен опуститься вниз и изме-
нить направление движения. Это означает, что в 
game_functions .py
необходимо 
внести серьезные изменения, потому что именно здесь программа проверяет, 
достиг ли какой-либо пришелец левого или правого края. Для этого мы напишем 
функции 
check_fleet_edges()
и 
change_fleet_direction()
, а затем изменим 
update_aliens()
:
game_functions.py
def check_fleet_edges(ai_settings, aliens):
"""Реагирует на достижение пришельцем края экрана."""
 
for alien in aliens.sprites():
if alien.check_edges():
change_fleet_direction(ai_settings, aliens)
break
def change_fleet_direction(ai_settings, aliens):
"""Опускает весь флот и меняет направление флота."""
for alien in aliens.sprites():
 
alien.rect.y += ai_settings.fleet_drop_speed
ai_settings.fleet_direction *= -1
def update_aliens(ai_settings, aliens):
"""
Проверяет, достиг ли флот края экрана,
после чего обновляет позиции всех пришельцев во флоте.
"""
 
check_fleet_edges(ai_settings, aliens)
aliens.update()
Функция 
check_fleet_edges()
перебирает флот и вызывает 
check_edges()
для 
каждого пришельца 

. Если 
check_edges()
возвращает 
True
, значит, пришелец 
находится у края и весь флот должен сменить направление, поэтому вызывает-
ся функция 
change_fleet_direction()
и происходит выход из цикла. Функция 
change_fleet_direction()
перебирает пришельцев и уменьшает высоту каждого 
из них с использованием настройки 
fleet_drop_speed

; затем направление 


270

Достарыңызбен бөлісу:
1   ...   160   161   162   163   164   165   166   167   ...   266




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

    Басты бет