Menu
CoddyTech

Màn hình menu

Thuộc phần Luật chơi trong hành trình Pygame của Coddy. Bài học 2 trên 30.

Hầu hết trò chơi mở ra ở màn hình menu: một tiêu đề và một dòng hướng dẫn cách bắt đầu. Menu là một trạng thái nữa. Bắt đầu với state = "menu" và vẽ một màn hình khác trong khi trạng thái này còn hiệu lực.

Bắt đầu trò chơi chỉ cần nhấn một phím, nên hãy đọc phím đó từ các sự kiện. Sự kiện KEYDOWN xuất hiện một lần mỗi lần nhấn, còn event.key cho biết đó là phím nào:

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

Phần state == "menu" rất quan trọng: phím Enter chỉ bắt đầu trò chơi khi đang ở menu. Sau đó, nhấn Enter trên màn hình khác sẽ không làm gì cả.

Giờ đây, việc vẽ cũng phụ thuộc vào trạng thái:

screen.fill((30, 30, 46))
if state == "menu":
    # tiêu đề và dòng chữ Nhấn Enter để chơi
else:
    # người chơi, tảng đá, điểm số, dòng chữ Trò chơi kết thúc

Code cập nhật vẫn nằm bên trong if state == "play":, nên không có gì di chuyển khi menu đang hiển thị.

challenge icon

Thử thách

Dễ

Mở trò chơi với một menu mà bạn có thể rời đi bằng phím Enter.

  1. Bắt đầu với state = "menu".
  2. Trong vòng lặp sự kiện, nhấn Enter khi đang ở menu sẽ đặt trạng thái thành "play".
  3. Khi trạng thái là "menu", chỉ vẽ Meteor Dodge ở giữa tại (240, 140) và Press Enter to play ở giữa tại (240, 200) trên nền tối; nếu không thì vẽ trò chơi.

Nhấn Chơi: menu sẽ hiện ra và nhấn Enter sẽ bắt đầu trò chơi. Sau đó nhấn Kiểm tra.

Tự làm thử

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()

Tất cả bài học trong Luật chơi

Tự luyện tập: Playground Pygame