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



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

Рис. 13.6. Сверхмощные пули упрощают тестирование  

некоторых аспектов игры




Уничтожение пришельцев    273

Восстановление флота

Одна из ключевых особенностей Alien Invasion — бесконечные орды пришельцев: 

каждый раз, когда вы уничтожаете один флот, на его месте появляется другой.

Чтобы после уничтожения одного флота появлялся другой, сначала нужно убе-

диться в том, что группа 

aliens

 пуста. Если она пуста, вызывается функция 



create_

fleet()


. Проверка будет выполняться в функции 

update_bullets()

, потому что 

именно здесь уничтожаются отдельные пришельцы:



game_functions.py

def update_bullets(ai_settings, screen, ship, aliens, bullets):

...

# Проверка попаданий в пришельцев.



# При обнаружении попадания удалить пулю и пришельца.

collisions = pygame.sprite.groupcollide(bullets, aliens, True, True)

    



    if len(aliens) == 0:



        # Уничтожение существующих пуль и создание нового флота.

        bullets.empty()



        create_fleet(ai_settings, screen, ship, aliens)

В точке  программа проверяет, пуста ли группа 

aliens

. Если она пуста, то все 



существующие пули удаляются методом 

empty()


, который удаляет все существу-

ющие спрайты из группы . Вызов метода 

create_fleet()

 снова заполняет экран 

пришельцами.

В определении 

update_bullets()

 теперь появились дополнительные параметры 

ai_settings

screen



 и 

ship


, поэтому вызов 

update_bullets()

 в 

alien_invasion .py



 не-

обходимо обновить:



alien_invasion.py

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

while True:

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

ship.update()

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

gf.update_aliens(ai_settings, aliens)

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

Новый флот появляется сразу же после уничтожения текущего флота.

Ускорение пуль

Попытавшись стрелять по пришельцам в текущем состоянии игры, вы заметите, 

что движение пуль немного замедлилось. Дело в том, что Pygame теперь выполняет 

больший объем работы при каждом проходе цикла. Скорость пуль можно увели-

чить настройкой 

bullet_speed_factor

 в 


settings .py

. Если увеличить это значение 

(например, до 3), пули снова будут двигаться по экрану с разумной скоростью:

settings.py

# Настройки пуль




274    Глава 13  •  Осторожно, пришельцы!

    self.bullet_speed_factor = 3

self.bul

...


Оптимальное значение этой настройки зависит от производительности вашей 

системы. Найдите значение, которое лучше подходит для вашей конкретной кон-

фигурации.

Рефакторинг update_bullets()

Переработаем функцию 

update_bullets()

, чтобы она не решала такое количество 

разных задач. Код обработки коллизий будет выделен в отдельную функцию:



game_functions.py

def update_bullets(ai_settings, screen, ship, aliens, bullets):

...

# Уничтожение исчезнувших пуль.



for bullet in bullets.copy():

if bullet.rect.bottom <= 0:

bullets.remove(bullet)

check_bullet_alien_collisions(ai_settings, screen, ship, aliens, bullets)

        

def check_bullet_alien_collisions(ai_settings, screen, ship, aliens, bullets):

    """Обработка коллизий пуль с пришельцами."""

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

collisions = pygame.sprite.groupcollide(bullets, aliens, True, True)

if len(aliens) == 0:

# Уничтожение существующих пуль и создание нового флота.

bullets.empty()

create_fleet(ai_settings, screen, ship, aliens)

Мы создали новую функцию 

check_bullet_alien_collisions()

 для выявления 

коллизий между пулями и пришельцами и для реакции на уничтожение всего 

флота. Это сделано для того, чтобы сократить длину функции 

update_bullets()

 

и упростить дальнейшую разработку.





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




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

    Басты бет