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



Pdf көрінісі
бет140/238
Дата07.01.2022
өлшемі7,86 Mb.
#18670
түріКнига
1   ...   136   137   138   139   140   141   142   143   ...   238
Байланысты:
2 5343781172763690906

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    Глава 13  •  Осторожно, пришельцы!

fleet_direction

 меняется на противоположное, для чего текущее значение умно-

жается на –1.

Мы изменили функцию 

update_aliens()

 и включили в нее проверку нахождения 

пришельцев у края вызовом 

check_fleet_edges()

 . Функция должна получать 

параметр 

ai_settings

, поэтому аргумент 

ai_settings

 включается в вызов 

update_


aliens()

:

alien_invasion.py

# Запуск основного цикла игры.

while True:

gf.check_events(ai_settings, screen, ship, bullets)

ship.update()

gf.update_bullets(bullets)

       gf.update_aliens(ai_settings, aliens)

gf.update_screen(ai_settings, screen, ship, aliens, bullets)

Если запустить игру сейчас, флот будет двигаться влево-вправо между краями 

экрана и опускаться каждый раз, когда он доберется до края. Теперь можно пере-

ходить к реализации уничтожения и отслеживания пришельцев, сталкивающихся 

с кораблем или достигающих нижнего края экрана.



Достарыңызбен бөлісу:
1   ...   136   137   138   139   140   141   142   143   ...   238




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

    Басты бет