Четырнадцатая проекта «Стрелялка с Pygame». Если пропустили, обязательно вернитесь и начните с первой части. В этот раз закончим игру с помощью экрана «Игра закончена» и добавим возможность начать сначала.
В этой серии уроков будет создана полноценная игра на языке Python с помощью библиотеки Pygame. Она будет особенно интересна начинающим программистам, которые уже знакомы с основами языка и хотят углубить знания, а также узнать, что лежит в основе создания игр.
Игра закончена
Сейчас, если у игрока заканчиваются жизни, программа просто резко обрывается. Выглядит не очень приятно, поэтому добавим экран «Игра закончена» и дадим возможность игрокам начать сначала, если они хотят.
Причина остановки программы в том, что игровой цикл управляется переменной running
(значение которой может быть только True
или False
), и в момент смерти игрока он становится False
. Вместо этого сделаем так, чтобы отслеживалось состояние игры (state
). Оно может быть следующим: демонстрация экрана с законченной игрой или непосредственно игра. Создадим в начале переменную game_over
:
# Цикл игры
game_over = True
running = True
while running:
if game_over:
show_go_screen()
Дальше нужно будет создать и show_go_screen
, но сперва необходимо подумать еще кое о чем. Когда игра заканчивается и переходит к соответствующему экрану, а игрок выбирает начать сначала, нужно сбросить все: очки, астероиды, жизни игрока и так далее. Сейчас эти элементы настраиваются перед началом игрового цикла, но их нужно переместить в позицию после show_go_screen()
, так, чтобы они происходили, когда игрок уже покидает этот экран.
# Цикл игры
game_over = True
running = True
while running:
if game_over:
show_go_screen()
game_over = False
all_sprites = pygame.sprite.Group()
mobs = pygame.sprite.Group()
bullets = pygame.sprite.Group()
powerups = pygame.sprite.Group()
player = Player()
all_sprites.add(player)
for i in range(8):
newmob()
score = 0
Также необходимо переключить значение game_over
на False
при старте новой игры. Теперь можно менять и то, что происходит, когда у игрока заканчиваются жизни.
# Если игрок умер, игра окончена
if player.lives == 0 and not death_explosion.alive():
game_over = True
Экран «Игра закончена»
Осталось определить, что будет делать экран show_go_screen
. Поскольку в этом примере достаточно будет лишь одного «экрана», ограничимся названием игры и инструкциями для игроков:
def show_go_screen():
screen.blit(background, background_rect)
draw_text(screen, "SHMUP!", 64, WIDTH / 2, HEIGHT / 4)
draw_text(screen, "Arrow keys move, Space to fire", 22,
WIDTH / 2, HEIGHT / 2)
draw_text(screen, "Press a key to begin", 18, WIDTH / 2, HEIGHT * 3 / 4)
pygame.display.flip()
waiting = True
while waiting:
clock.tick(FPS)
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
if event.type == pygame.KEYUP:
waiting = False
Игра будет просить «Нажать клавишу для старта». Это поведение нужно обрабатывать с помощью цикла while. Его можно воспринимать как миниатюрный игровой цикл, который проверяет всего два события. Первое — pygame.QUIT
, которое происходит при нажатии на крестик окна программы. Второе — нажатие клавиши для старта. Важно отметить, что pygame.KEYDOWN
здесь не используется.
Вместо этого указана KEYUP
. Это нужно для того, чтобы игра не начиналась до тех пор, пока игрок не отпустит клавишу.
Это простейший способ сделать игровой экран. Есть масса других вариантов, но об этом — в следующих уроках.
Код урока — shmup-14.py
Итого
Вот и все, ваша первая игра на Pygame готова. Если вы следовали инструкциям и выполняли все задания, то это неплохой старт для начинающего программиста.
При этом есть еще много вещей, которые можно было бы добавить в игру:
- Увеличивающуюся сложность
- Больше улучшений
- Врагов (отстреливающихся)
- Систему очков
- Уровни с боссами
И это только самые очевидные идеи.
Спасибо за то, что читали эти уроки и выполняли задания.