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úcCode 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ị.
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.
- Bắt đầu với
state = "menu". - Trong vòng lặp sự kiện, nhấn Enter khi đang ở menu sẽ đặt trạng thái thành
"play". - 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
1Trạng thái trò chơi
Một biến trạng tháiMàn hình menuNhấn R để chơi lạiMột hàm đặt lạiMỗi trạng thái một hàmTự luyện tập: Playground Pygame