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 Глава 13 • Осторожно, пришельцы!
Обработка столкновений с кораблем
Теперь нужно разобраться, что же происходит при столкновении пришельца
с кораблем. Вместо того чтобы уничтожать экземпляр
ship
и создавать новый,
мы будем подсчитывать количество уничтоженных кораблей; для этого следует
организовать сбор статистики по игре. (Статистика также пригодится для под-
счета очков.)
Напишем новый класс
GameStats
для ведения статистики и сохраним его в файле
game_stats .py
:
Достарыңызбен бөлісу: