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 pausednot 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.
Thử thách
Trung bìnhNhấn P để tạm dừng trò chơi.
- 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. - Chỉ chạy trò chơi khi
lives > 0 and score < 10 and not paused. - Khi
pausedlà 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