Menu
CoddyTech

Tạm dừng

Bài học 16 trên 41 trong khóa học Tạo trò chơi với Pygame của Coddy.

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 mỗi 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, 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, giữ phím P trong chốc lát sẽ bật rồi tắt trạng thái tạm dừng ở mỗi 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 trạng thái tạm dừng vào điều kiện chạy trò chơi, rồi hiển thị Paused khi trò chơi đang tạm dừng.

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 khi khóa 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à True, 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 Tạo trò chơi với Pygame

Tự luyện tập: Playground Pygame