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



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


Глава 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()
и упростить дальнейшую разработку.
УПРАЖНЕНИЯ
13-5 . Ловец: создайте игру с персонажем, который может двигаться влево и вправо у ниж-
него края экрана . Мяч появляется в случайной позиции у верхнего края и падает вниз 
с постоянной скоростью . Если персонаж «ловит» мяч, сталкиваясь с ним, мяч исчезает . 
Создавайте новый мяч каждый раз, когда персонаж ловит мяч или когда мяч исчезает 
у нижнего края экрана .
Завершение игры
Какое удовольствие от игры, в которой невозможно проиграть? Если игрок 
не успеет сбить флот достаточно быстро, пришельцы уничтожат корабль при 
столкновении. При этом количество кораблей, используемых игроком, ограничено, 
и корабль уничтожается, когда пришелец достигает нижнего края экрана. Игра 
завершается в тот момент, когда у игрока кончатся все корабли.


Завершение игры
275
Обнаружение коллизий с кораблем
Начнем с проверки коллизий между пришельцами и кораблем, чтобы мы 
могли правильно обработать столкновения с пришельцами. Коллизии «при-
шелец-корабль» проверяются немедленно после обновления позиции каждого 
пришельца:
game_functions.py
def update_aliens(ai_settings, ship, aliens):
"""
Проверяет, достиг ли флот края экрана,
после чего обновляет позиции всех пришельцев во флоте.
"""
check_fleet_edges(ai_settings, aliens)
aliens.update()
# Проверка коллизий "пришелец-корабль".
 
if pygame.sprite.spritecollideany(ship, aliens):
 
print("Ship hit!!!")
Метод 
spritecollideany()
получает два аргумента: спрайт и группу. Метод пыта-
ется найти любой элемент группы, вступивший в коллизию со спрайтом, и оста-
навливает цикл по группе сразу же после обнаружения столкнувшегося элемента. 
В данном случае он перебирает группу 
aliens
и возвращает первого пришельца, 
столкнувшегося с кораблем.
Если ни одна коллизия не обнаружена, 
spritecollideany()
возвращает 
None
, и блок 
if
в точке 

не выполняется. Если же будет обнаружен пришелец, столкнувшийся 
с кораблем, метод возвращает этого пришельца, и выполняется блок 
if
: выводится 
сообщение 
Ship
hit!!!

. (При столкновении пришельца с кораблем необходимо 
выполнить ряд операций: удалить всех оставшихся пришельцев и пули, вернуть 
корабль в центр и создать новый флот. Прежде чем писать код всех этих операций, 
необходимо убедиться в том, что решение с обнаружением коллизий с кораблем 
работает правильно. Команда 
print
всего лишь позволяет легко проверить правиль-
ность обнаружения коллизий.)
Далее необходимо передать 
ship
функции 
update_aliens()
:
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, ship, aliens)
gf.update_screen(ai_settings, screen, ship, aliens, bullets)
Если вы запустите Alien Invasion, при столкновении пришельца с кораблем в тер-
минальном окне появляется сообщение 
Ship
hit!!!
. В ходе тестирования этого 
аспекта присвойте 
alien_drop_speed
более высокое значение (например, 50 или 
100), чтобы пришельцы быстрее добирались до вашего корабля.


276

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




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

    Басты бет