Menu
CoddyTech

Ekran menu

Część sekcji Zasady gry ścieżki Pygame w Coddy. Lekcja 2 z 29.

Większość gier otwiera się na menu: tytule i tekście informującym, jak rozpocząć. Menu to kolejny stan. Zacznij od state = "menu" i wyświetlaj inny ekran, gdy ten stan jest aktywny.

Rozpoczęcie gry wymaga naciśnięcia jednego klawisza, więc odczytaj je ze zdarzeń. Zdarzenie KEYDOWN pojawia się raz przy każdym naciśnięciu, a event.key informuje, który to był klawisz:

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

Warunek state == "menu" ma znaczenie: Enter rozpoczyna grę tylko w menu. Później naciśnięcie Enter na innym ekranie nic nie robi.

Rysowanie również zależy teraz od stanu:

screen.fill((30, 30, 46))
if state == "menu":
    # tytuł i napis Naciśnij Enter, aby zagrać
else:
    # gracz, skała, wynik i napis Koniec gry

Kod aktualizacji nadal znajduje się wewnątrz if state == "play":, więc nic się nie porusza, gdy wyświetlane jest menu.

challenge icon

Wyzwanie

Łatwy
  1. Zacznij od state = "menu".
  2. W pętli zdarzeń, gdy naciśniesz Enter, a stan to "menu", ustaw go na "play".
  3. Gdy stan to "menu", narysuj na ciemnym tle tylko Meteor Dodge wyśrodkowane w punkcie (240, 140) oraz Press Enter to play wyśrodkowane w punkcie (240, 200).
  4. W przeciwnym razie narysuj grę jak wcześniej.

Spróbuj swoich sił

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 iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Zasady gry

Poćwicz samodzielnie: Edytor online Pygame