Menu
CoddyTech

Tạm dừng

Thuộc phần Vòng lặp trò chơi trong hành trình Pygame của Coddy. Bài học 33 trên 35.

Có hai cách để đọc bàn phím. pygame.key.get_pressed() cho biết phím nào đang được giữ ở thời điểm hiện tại, trong từng khung hình: phù hợp để di chuyển. Sự kiện KEYDOWN xuất hiện một lần, trong khung hình phím được nhấn xuống, giống như MOUSEBUTTONDOWN khi nhấp chuột: phù hợp với các hành động chỉ xảy ra một lần mỗi lần nhấn.

Tạm dừng là hành động chỉ xảy ra một lần mỗi lần nhấn. Với get_pressed, nếu giữ phím P một lúc, trạng thái tạm dừng sẽ bật rồi tắt trong từng khung hình. Với sự kiện, trạng thái chỉ đổi một lần:

for event in pygame.event.get():
    if event.type == pygame.QUIT:
        running = False
    elif event.type == pygame.KEYDOWN:
        if event.key == pygame.K_p:
            paused = not paused

not paused đổi True thành False và ngược lại. Thêm điều kiện tạm dừng vào điều kiện chạy trò chơi, rồi hiển thị Paused khi trạng thái này bật.

challenge icon

Thử thách

Trung bình

Nhấn P để tạm dừng trò chơi.

  1. Trước vòng lặp, đặt paused = False. Trong vòng lặp sự kiện, đảo trạng thái của biến này khi phím của sự kiện KEYDOWN là pygame.K_p.
  2. Chỉ chạy trò chơi khi lives > 0 and score < 10 and not paused.
  3. Khi paused là đúng, hiển thị Paused ở chính giữa tại (240, 160).

Nhấn Chơi rồi nhấn P: trò chơi sẽ đóng băng và hiển thị Paused. 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("Catch the Blocks")
clock = pygame.time.Clock()
font = pygame.font.Font(None, 32)

basket = pygame.Rect(200, 330, 80, 16)
block = pygame.Rect(220, 0, 20, 20)
score = 0
lives = 3

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    if lives > 0 and score < 10:
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT]:
            basket.x -= 8
        if keys[pygame.K_RIGHT]:
            basket.x += 8
        basket.clamp_ip(screen.get_rect())

        block.y += 3
        if block.top > 360:
            block.y = -20
            block.x = random.randint(0, 460)
            lives -= 1
        if block.colliderect(basket):
            block.y = -20
            block.x = random.randint(0, 460)
            score += 1

    screen.fill((30, 30, 46))
    pygame.draw.rect(screen, (80, 160, 255), basket)
    pygame.draw.rect(screen, (235, 80, 80), block)
    score_text = font.render(f"Score: {score}", True, (240, 240, 240))
    screen.blit(score_text, (10, 10))
    lives_text = font.render(f"Lives: {lives}", True, (240, 240, 240))
    screen.blit(lives_text, (370, 10))
    if lives == 0:
        message = font.render("Game over", True, (240, 240, 240))
        screen.blit(message, message.get_rect(center=(240, 160)))
    elif score == 10:
        message = font.render("You win!", 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 Vòng lặp trò chơi

Tự luyện tập: Playground Pygame