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 pausednot 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.
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 của biến này khi phím 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à đú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
1Di chuyển hình vuông
Mở cửa sổTô nền4Di chuyển theo thời gian
Thời gian deltaPixel mỗi giâyVector2Gia tốc và ma sátDi chuyển vòng quanh màn hìnhTự luyện tập: Playground Pygame