Для тестирования конкретных аспектов игры можно изменить игровые настройки так, чтобы упростить конкретную область. Например, можно уменьшить экран, чтобы на нем было меньше пришельцев, или увеличить скорость пули и количество пуль, одновременно находящихся на экране.

Мое любимое изменение при тестировании Alien Invasion — использование сверхшироких пуль, которые остаются активными даже после попадания в пришельца (рис. 13.6). Попробуйте задать настройке bullet_width значение 300 и посмотрите, сколько времени вам понадобится для уничтожения флота пришельцев!

Такие изменения повышают эффективность тестирования, а заодно могут подсказать идеи для всевозможных игровых бонусов. (Только не забудьте восстановить нормальное состояние настроек после завершения тестирования.)

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

<p>Восстановление флота</p>

Одна из ключевых особенностей 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)

. .

(1) . .if len(aliens) == 0:

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

(2) . . . .bullets.empty()

. . . .create_fleet(ai_settings, screen, ship, aliens)

В точке (1) программа проверяет, пуста ли группа aliens. Если она пуста, то все существующие пули удаляются методом empty(), который удаляет все существующие спрайты из группы (2). Вызов метода 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)

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

<p>Ускорение пуль</p>

Попытавшись стрелять по пришельцам в текущем состоянии игры, вы заметите, что движение пуль немного замедлилось. Дело в том, что Pygame теперь выполняет больший объем работы при каждом проходе цикла. Скорость пуль можно увеличить настройкой bullet_speed_factor в settings.py. Если увеличить это значение (например, до 3), пули снова будут двигаться по экрану с разумной скоростью:

settings.py

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

. .self.bullet_speed_factor = 3

self.bul

...

Оптимальное значение этой настройки зависит от производительности вашей системы. Найдите значение, которое лучше подходит для вашей конкретной конфигурации.

<p>Рефакторинг update_bullets()</p>

Переработаем функцию 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. Ловец: создайте игру с персонажем, который может двигаться влево и вправо у нижнего края экрана. Мяч появляется в случайной позиции у верхнего края и падает вниз с постоянной скоростью. Если персонаж «ловит» мяч, сталкиваясь с ним, мяч исчезает. Создавайте новый мяч каждый раз, когда персонаж ловит мяч или когда мяч исчезает у нижнего края экрана.

<p>Завершение игры</p>
Перейти на страницу:

Все книги серии Библиотека программиста

Похожие книги