Menu
CoddyTech

Una schermata del menu

Fa parte della sezione Regole di gioco del percorso Pygame di Coddy. Lezione 2 di 29.

La maggior parte dei giochi si apre su un menu: un titolo e una riga che ti dice come iniziare. Un menu è un altro stato. Inizia con state = "menu" e disegna una schermata diversa finché è attivo.

Per avviare il gioco basta premere un tasto, quindi rilevalo dagli eventi. Un evento KEYDOWN si verifica una volta per ogni pressione e event.key indica quale tasto è stato premuto:

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

La parte state == "menu" è importante: Invio avvia il gioco solo quando si è nel menu. In seguito, premere Invio in un'altra schermata non fa nulla.

Anche il disegno ora dipende dallo stato:

screen.fill((30, 30, 46))
if state == "menu":
    # il titolo e «Premi Enter per giocare»
else:
    # il giocatore, la roccia, il punteggio, la schermata di fine partita

Il codice di aggiornamento è ancora sotto if state == "play":, quindi non si muove nulla mentre è visualizzato il menu.

challenge icon

Sfida

Facile
  1. Inizia con state = "menu".
  2. Nel ciclo degli eventi, quando premi Invio e lo stato è "menu", impostalo su "play".
  3. Mentre lo stato è "menu", disegna sullo sfondo scuro solo Meteor Dodge centrato in (240, 140) e Press Enter to play centrato in (240, 200).
  4. Altrimenti, disegna il gioco come prima.

Provalo tu

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 iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Regole di gioco

Esercitati da solo: Playground Pygame