Menu
CoddyTech

Uma tela de menu

Parte da seção Regras do jogo do Journey de Pygame da Coddy. Lição 2 de 29.

A maioria dos jogos abre com um menu: um título e uma linha dizendo como começar. Um menu é mais um estado. Comece com state = "menu" e desenhe uma tela diferente enquanto ele estiver ativo.

Iniciar o jogo exige apenas o pressionamento de uma tecla, então leia essa informação dos eventos. Um evento KEYDOWN ocorre uma vez por pressionamento, e event.key indica qual tecla foi:

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

A parte state == "menu" é importante: Enter significa iniciar apenas no menu. Depois, pressionar Enter em outra tela não faz nada.

Agora, o desenho também depende do estado:

screen.fill((30, 30, 46))
if state == "menu":
    # o título e Pressione Enter para jogar
else:
    # o jogador, a pedra, a pontuação, Fim de jogo

O código de atualização continua dentro de if state == "play":, então nada se move enquanto o menu está sendo exibido.

challenge icon

Desafio

Fácil
  1. Comece com state = "menu".
  2. No loop de eventos, quando Enter for pressionado e o estado for "menu", defina-o como "play".
  3. Enquanto o estado for "menu", desenhe apenas Meteor Dodge centralizado em (240, 140) e Press Enter to play centralizado em (240, 200) sobre o fundo escuro.
  4. Caso contrário, desenhe o jogo como antes.

Experimente você mesmo

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 iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Regras do jogo

Pratique por conta própria: Playground de Pygame