Как создать меню «Пуск» и экран «Игра окончена» с помощью PyGame

669
технологии 1.webp

Последнее обновление 30.01.2023 — Василий Иванов

Такие читатели, как вы, помогают поддерживать MUO. Когда вы совершаете покупку по ссылкам на нашем сайте, мы можем получать партнерскую комиссию. Читать больше.

PyGame — это популярная библиотека для создания проектов с помощью Python, которая предоставляет мощный набор инструментов для разработки игр. В этой статье вы узнаете, как создать меню «Пуск» и экран окончания игры для простой игры с помощью PyGame.​​​​

Создание простой игры

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

Для начала вам необходимо импортировать необходимые модули. Вы будете использовать модуль pygame для доступа к функциям PyGame. Для установки модуля вы можете использовать менеджер пакетов pip:

 pip install pygame 

Теперь, когда наш модуль готов к использованию, давайте создадим простую игру с игроком, который может двигаться влево или вправо, используя клавиши со стрелками и препятствие. Если вы столкнетесь с препятствием, игра закончится. Вот код для того же:

 import pygame
pygame.init()

screen_width = 750
screen_height = 450
screen = pygame.display.set_mode((screen_width, screen_height))

obstacle_x = 400
obstacle_y = 400
obstacle_width = 40
obstacle_height = 40
player_x = 200
player_y = 400
player_width = 20
player_height = 20

while True:
    
    for event in pygame.event.get():
        
        if event.type == pygame.QUIT:
            pygame.quit()
            quit()

    
    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        player_x -= 5
    if keys[pygame.K_RIGHT]:
        player_x += 5

   
    if player_x + player_width > obstacle_x and player_x < obstacle_x + obstacle_width and player_y + player_height > obstacle_y and player_y < obstacle_y + obstacle_height:
        game_over = True

    
    screen.fill((0, 0, 0))
    pygame.draw.rect(screen, (255, 0, 0), (obstacle_x, obstacle_y, obstacle_width, obstacle_height))
    pygame.draw.rect(screen, (0, 255, 0), (player_x, player_y, player_width, player_height))
    pygame.display.update()

В приведенном выше коде вы настраиваете окно игры и объявляете игровые переменные. Вы также обрабатывали пользовательский ввод и рисовали элементы на экране.

По теме:  Как удалить профиль Discovery+ с любого устройства

Создание меню «Пуск»

Теперь, когда у вас есть базовая игра, давайте создадим стартовое меню. Для этого вам нужно будет объявить глобальную переменную для состояния игры. Эта переменная будет отслеживать текущее состояние игры, например, активно ли меню «Пуск» или запущена игра. Вам нужно добавить эту переменную в начало кода вашей игры:

 game_state = "start_menu" 

Далее вы добавите функцию для рисования стартового меню на экране. Вы можете использовать функции PyGame для рисования текста, кнопок и других элементов на экране.

 def draw_start_menu():
    screen.fill((0, 0, 0))
    font = pygame.font.SysFont('arial', 40)
    title = font.render('My Game', True, (255, 255, 255))
    start_button = font.render('Start', True, (255, 255, 255))
    screen.blit(title, (screen_width/2 - title.get_width()/2, screen_height/2 - title.get_height()/2))
    screen.blit(start_button, (screen_width/2 - start_button.get_width()/2, screen_height/2 + start_button.get_height()/2))
    pygame.display.update()

Затем вы можете добавить функцию draw_start_menu() в основной игровой цикл.

 while True: 

   for event in pygame.event.get():
       if event.type == pygame.QUIT:
           pygame.quit()
           quit()

   if game_state == "start_menu":
       draw_start_menu()
  
   if game_state == "game":
       keys = pygame.key.get_pressed()
       # rest of the code

Теперь меню «Пуск» будет отображено на экране. Последним шагом является обработка пользовательского ввода. Вы можете добавить оператор if в основной цикл игры, чтобы проверить, нажал ли пользователь кнопку запуска.

 if game_state == "start_menu":
    keys = pygame.key.get_pressed()
    if keys[pygame.K_SPACE]:
        player_x = 200
        player_y = 400
        game_state = "game"
        game_over = False

С этим кодом игра запустится, когда пользователь нажмет кнопку запуска.

Реализация экрана Game Over

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

 def draw_game_over_screen():
   screen.fill((0, 0, 0))
   font = pygame.font.SysFont('arial', 40)
   title = font.render('Game Over', True, (255, 255, 255))
   restart_button = font.render('R - Restart', True, (255, 255, 255))
   quit_button = font.render('Q - Quit', True, (255, 255, 255))
   screen.blit(title, (screen_width/2 - title.get_width()/2, screen_height/2 - title.get_height()/3))
   screen.blit(restart_button, (screen_width/2 - restart_button.get_width()/2, screen_height/1.9 + restart_button.get_height()))
   screen.blit(quit_button, (screen_width/2 - quit_button.get_width()/2, screen_height/2 + quit_button.get_height()/2))
   pygame.display.update()

Затем вы можете добавить эту функцию в основной игровой цикл.

 if game_state == "start_menu":
    draw_start_menu()
if game_state == "game_over":
    draw_game_over_screen()
    
if game_state == "game":
    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        player_x -= 5
    if keys[pygame.K_RIGHT]:
        player_x += 5
   
if player_x + player_width > obstacle_x and player_x < obstacle_x + obstacle_width and player_y + player_height > obstacle_y and player_y < obstacle_y + obstacle_height:
    game_over = True
    game_state = "game_over"

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

 if game_state == "start_menu":
    keys = pygame.key.get_pressed()
    if keys[pygame.K_SPACE]:
        game_state = "game"
       player_x = 200
       player_y = 400
       game_state = "game"
       game_over = False

if game_state == "game_over":
    keys = pygame.key.get_pressed()
    if keys[pygame.K_r]:
        game_state = "start_menu"
    if keys[pygame.K_q]:
        pygame.quit()
        quit()

С этим кодом игра перезапускается, когда пользователь нажимает кнопку «R», и завершается, когда пользователь нажимает кнопку «Q» на клавиатуре.

Ниже приведен полный код:

 import pygame

pygame.init()
screen_width = 750
screen_height = 450
screen = pygame.display.set_mode((screen_width, screen_height))
obstacle_x = 400
obstacle_y = 400
obstacle_width = 40
obstacle_height = 40
player_x = 200
player_y = 400
player_width = 20
player_height = 20
game_state = "start_menu"

def draw_start_menu():
   screen.fill((0, 0, 0))
   font = pygame.font.SysFont('arial', 40)
   title = font.render('My Game', True, (255, 255, 255))
   start_button = font.render('Start', True, (255, 255, 255))
   screen.blit(title, (screen_width/2 - title.get_width()/2, screen_height/2 - title.get_height()/2))
   screen.blit(start_button, (screen_width/2 - start_button.get_width()/2, screen_height/2 + start_button.get_height()/2))
   pygame.display.update()

def draw_game_over_screen():
   screen.fill((0, 0, 0))
   font = pygame.font.SysFont('arial', 40)
   title = font.render('Game Over', True, (255, 255, 255))
   restart_button = font.render('R - Restart', True, (255, 255, 255))
   quit_button = font.render('Q - Quit', True, (255, 255, 255))
   screen.blit(title, (screen_width/2 - title.get_width()/2, screen_height/2 - title.get_height()/3))
   screen.blit(restart_button, (screen_width/2 - restart_button.get_width()/2, screen_height/1.9 + restart_button.get_height()))
   screen.blit(quit_button, (screen_width/2 - quit_button.get_width()/2, screen_height/2 + quit_button.get_height()/2))
   pygame.display.update()

while True:
   for event in pygame.event.get():
       if event.type == pygame.QUIT:
           pygame.quit()
           quit()
   if game_state == "start_menu":
       draw_start_menu()
       keys = pygame.key.get_pressed()
       if keys[pygame.K_SPACE]:
           player_x = 200
           player_y = 400
           game_state = "game"
           game_over = False
   elif game_state == "game_over":
       draw_game_over_screen()
       keys = pygame.key.get_pressed()
       if keys[pygame.K_r]:
           game_state = "start_menu"
       if keys[pygame.K_q]:
           pygame.quit()
           quit()
  
   elif game_state == "game":
       keys = pygame.key.get_pressed()
       if keys[pygame.K_LEFT]:
           player_x -= 5
       if keys[pygame.K_RIGHT]:
           player_x += 5
  
       if player_x + player_width > obstacle_x and player_x < obstacle_x + obstacle_width and player_y + player_height > obstacle_y and player_y < obstacle_y + obstacle_height:
           game_over = True
           game_state = "game_over"
      
       screen.fill((0, 0, 0))
       pygame.draw.rect(screen, (255, 0, 0), (obstacle_x, obstacle_y, obstacle_width, obstacle_height))
       pygame.draw.rect(screen, (0, 255, 0), (player_x, player_y, player_width, player_height))
       pygame.display.update()
  
   elif game_over:
       game_state = "game_over"
       game_over = False

Код начинается с импорта модуля pygame и его инициализации. Затем он создает игровое окно и объявляет необходимые игровые переменные, включая позицию игрока и препятствия, размеры и состояние игры.

Код определяет две функции, draw_start_menu() и draw_game_over_screen(), для отрисовки начального меню и экрана завершения игры. Эти функции используют функции PyGame для вывода текста и кнопок на экран.

Основной игровой цикл начинается с обработки событий и проверки состояния игры. Если состояние игры — start_menu, стартовое меню отображается на экране. Если состояние игры — game_over, на экране отображается экран завершения игры. Если состояние игры другое, игра обновляется и рисует игрока и препятствие на экране.

Игра обновляется, обрабатывая нажатия клавиш и проверяя наличие столкновения между игроком и препятствием. Если происходит столкновение, игра устанавливает флаг game_over в значение True и устанавливает состояние игры в game_over.

После обновления игры игрок и препятствие отрисовываются на экране. Наконец, код проверяет, установлен ли флаг game_over, и если он установлен, он сбрасывает флаг и устанавливает состояние игры в game_over.

Этот процесс повторяется непрерывно, пока игровое окно не будет закрыто.

Увеличьте вовлеченность пользователей с помощью визуально привлекательного пользовательского интерфейса

Использование хорошо продуманного пользовательского интерфейса (UI) может значительно увеличить вовлеченность пользователей в игру PyGame. Четкий и легко читаемый шрифт, визуально привлекательная графика, удобная навигация и обратная связь с пользователем — все это важные элементы, которые следует учитывать при разработке пользовательского интерфейса. Реализуя эти элементы, вы можете создать пользовательский интерфейс, который поможет поддерживать интерес игрока и погрузить его в игру.

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