Menu
CoddyTech

Экран меню

Часть раздела Правила игры путешествия по Pygame на Coddy. Урок 2 из 29.

Большинство игр открываются меню: заголовком и строкой с инструкцией о том, как начать. Меню — это ещё одно состояние. Начни с state = "menu" и отображай другой экран, пока активно это состояние.

Чтобы начать игру, нужно нажать одну клавишу, поэтому считывай нажатие из событий. Событие KEYDOWN возникает один раз при каждом нажатии, а event.key указывает, какая именно это была клавиша:

if event.type == pygame.KEYDOWN:
    if event.key == pygame.K_RETURN and state == "menu":
        state = "play"

Часть state == "menu" важна: Enter начинает игру только в меню. Позже нажатие Enter на другом экране ничего не делает.

Теперь отрисовка тоже зависит от состояния:

screen.fill((30, 30, 46))
if state == "menu":
    # заголовок и надпись «Нажмите Enter, чтобы начать игру»
else:
    # игрок, камень, счёт, надпись «Игра окончена»

Код обновления по-прежнему находится внутри if state == "play":, поэтому, пока отображается меню, ничего не движется.

challenge icon

Задание

Легко
  1. Начни с state = "menu".
  2. В цикле обработки событий, когда нажата клавиша Enter и состояние равно "menu", установи для него значение "play".
  3. Пока состояние равно "menu", нарисуй на тёмном фоне только Meteor Dodge по центру в точке (240, 140) и Press Enter to play по центру в точке (240, 200).
  4. В противном случае нарисуй игру, как и раньше.

Попробуйте сами

import random
import pygame

pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Meteor Dodge")
clock = pygame.time.Clock()
font = pygame.font.Font(None, 32)

player = pygame.Rect(220, 300, 40, 40)
rock = pygame.Rect(random.randint(0, 456), -24, 24, 24)
score = 0
state = "play"

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

    if state == "play":
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT]:
            player.x -= 6
        if keys[pygame.K_RIGHT]:
            player.x += 6
        player.clamp_ip(screen.get_rect())

        rock.y += 4
        if rock.top > 360:
            rock.y = -24
            rock.x = random.randint(0, 456)
            score += 1
        if rock.colliderect(player):
            state = "over"

    screen.fill((30, 30, 46))
    pygame.draw.rect(screen, (255, 196, 0), player)
    pygame.draw.rect(screen, (235, 80, 80), rock)
    score_text = font.render(f"Score: {score}", True, (240, 240, 240))
    screen.blit(score_text, (10, 10))
    if state == "over":
        message = font.render("Game over", True, (240, 240, 240))
        screen.blit(message, message.get_rect(center=(240, 160)))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Правила игры

Потренируйтесь самостоятельно: Песочница Pygame